tdf#133342 Add user defined percent string

With Add/Delete decimal place, insert percent char
and string text between number and '%'

Change-Id: I4a97e4361228020803810692d7977e5806baf180
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94757
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack@redhat.com>
diff --git a/include/svl/zformat.hxx b/include/svl/zformat.hxx
index 5b6f7024..abd805d 100644
--- a/include/svl/zformat.hxx
+++ b/include/svl/zformat.hxx
@@ -297,6 +297,8 @@ public:
    // nPos == 0xFFFF => last substring
    short GetNumForType( sal_uInt16 nNumFor, sal_uInt16 nPos ) const;

    OUString GetPercentString( sal_uInt16 nNumFor = 0 ) const;

    OUString GetDenominatorString( sal_uInt16 nNumFor ) const;
    OUString GetNumeratorString( sal_uInt16 nNumFor ) const;
    OUString GetIntegerFractionDelimiterString( sal_uInt16 nNumFor ) const;
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 8186800ec..f8652a0 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -3094,7 +3094,7 @@ OUString SvNumberFormatter::GenerateFormat(sal_uInt32 nIndex,
    }
    if (eType == SvNumFormatType::PERCENT)
    {
        sString.append('%');
        sString.append( pFormat->GetPercentString() );
    }
    else if (eType == SvNumFormatType::SCIENTIFIC)
    {
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 4532e33..8e78cf6 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -2289,6 +2289,33 @@ void lcl_GetOutputStringScientific(double fNumber, sal_uInt16 nCharCount,
                                              nPrec, rFormatter.GetNumDecimalSep()[0], true );
}

OUString lcl_GetPercentString(const ImpSvNumberformatInfo &rInfo, sal_uInt16 nCnt)
{
    sal_Int32 i;
    OUStringBuffer aPercentString;
    for( i = 0; i < nCnt; i++ )
    {
        if( rInfo.nTypeArray[i] == NF_SYMBOLTYPE_PERCENT )
        {
            aPercentString.append( rInfo.sStrArray[i] );
            bool bStringFound = false;
            for( i--; i >= 0 && rInfo.nTypeArray[i] == NF_SYMBOLTYPE_STRING ; i-- )
            {
                if( !bStringFound )
                {
                    bStringFound = true;
                    aPercentString.insert( 0, "\"" );
                }
                aPercentString.insert( 0, rInfo.sStrArray[i] );
            }
            i = nCnt;
            if( bStringFound )
                aPercentString.insert( 0, "\"" );
      }
    }
    return aPercentString.makeStringAndClear();
}

OUString lcl_GetDenominatorString(const ImpSvNumberformatInfo &rInfo, sal_uInt16 nCnt)
{
    sal_Int32 i;
@@ -2363,6 +2390,13 @@ OUString lcl_GetIntegerFractionDelimiterString(const ImpSvNumberformatInfo &rInf

}

OUString SvNumberformat::GetPercentString( sal_uInt16 nNumFor ) const
{
    const ImpSvNumberformatInfo& rInfo = NumFor[nNumFor].Info();
    sal_uInt16 nCnt = NumFor[nNumFor].GetCount();
    return lcl_GetPercentString( rInfo, nCnt );
}

OUString SvNumberformat::GetDenominatorString( sal_uInt16 nNumFor ) const
{
    const ImpSvNumberformatInfo& rInfo = NumFor[nNumFor].Info();