[Libreoffice-commits] core.git: svl/source

Laurent Balland-Poirier laurent.balland-poirier at laposte.net
Fri Jul 22 10:38:48 UTC 2016


 svl/source/numbers/zformat.cxx |   68 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 58 insertions(+), 10 deletions(-)

New commits:
commit 3363539e425d5d8f75d976ca2261c07086d6d06a
Author: Laurent Balland-Poirier <laurent.balland-poirier at laposte.net>
Date:   Wed Jul 6 00:10:38 2016 +0200

    tdf#100834 String between integer and fraction
    
    Fraction number format
    Insert Blank delimiter string between Integer/Fraction only if both of them are present
    In other cases, replace string with blank string if there are some '?' in formats
    Else insert nothing.
    
    If there is no fraction part, insert blank instead of '/' if there are some '?' in formats
    
    Change-Id: Ib606bdaa2b3809f15ce23acc3b5b6ee3fdbd230d
    Reviewed-on: https://gerrit.libreoffice.org/27252
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 9d5de1c..a638581 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -2002,6 +2002,24 @@ OUString lcl_GetNumeratorString(const ImpSvNumberformatInfo &rInfo, sal_uInt16 n
     return aNumeratorString.makeStringAndClear();
 }
 
+OUString lcl_GetFractionIntegerString(const ImpSvNumberformatInfo &rInfo, sal_uInt16 nAnz)
+{
+    sal_Int16 i;
+    OUStringBuffer aIntegerString;
+    for( i = 0; i < nAnz; i++ )
+    {
+        if( rInfo.nTypeArray[i] == NF_SYMBOLTYPE_FRACBLANK )
+        {
+            for( i--; i >= 0 && rInfo.nTypeArray[i] == NF_SYMBOLTYPE_DIGIT ; i-- )
+            {
+                aIntegerString.insert( 0, rInfo.sStrArray[i] );
+            }
+            i = nAnz;
+        }
+    }
+    return aIntegerString.makeStringAndClear();
+}
+
 }
 
 OUString SvNumberformat::GetDenominatorString( sal_uInt16 nNumFor ) const
@@ -2397,6 +2415,9 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
     OUStringBuffer sStr, sFrac, sDiv; // Strings, value for
     sal_uInt64 nFrac=0, nDiv=1;       // Integral part
     bool bSign = false;               // Numerator and denominator
+    const OUString sIntegerFormat = lcl_GetFractionIntegerString(rInfo, nAnz);
+    const OUString sNumeratorFormat = lcl_GetNumeratorString(rInfo, nAnz);
+    const OUString sDenominatorFormat = lcl_GetDenominatorString(rInfo, nAnz);
 
     if (fNumber < 0)
     {
@@ -2420,7 +2441,7 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
         return false;
     }
 
-    if( sal_Int32 nForcedDiv = lcl_GetDenominatorString(rInfo, nAnz).toInt32() )
+    if( sal_Int32 nForcedDiv = sDenominatorFormat.toInt32() )
     {   // Forced Denominator
         nDiv = (sal_uInt64) nForcedDiv;
         nFrac = (sal_uInt64)floor ( fNumber * nDiv );
@@ -2500,9 +2521,9 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
         impTransliterate(sStr, NumFor[nIx].GetNatNum());
     }
     bool bHideFraction = (rInfo.nCntPre > 0 && nFrac == 0
-                        && (lcl_GetNumeratorString(rInfo, nAnz).indexOf('0') < 0)
-                        && (lcl_GetDenominatorString(rInfo, nAnz).indexOf('0') < 0
-                            || lcl_GetDenominatorString(rInfo, nAnz).toInt32() > 0) );
+                        && (sNumeratorFormat.indexOf('0') < 0)
+                        && (sDenominatorFormat.indexOf('0') < 0
+                        || sDenominatorFormat.toInt32() > 0) );
     if ( bHideFraction )
     {
         sDiv.truncate();
@@ -2522,8 +2543,10 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
     if (rInfo.nTypeArray[j] == NF_SYMBOLTYPE_FRAC)
     {
         if ( bHideFraction )
-        {
-            sDiv.insert(0, ' ');
+        {   // do not insert blank for fraction if there is no '?'
+            if ( sNumeratorFormat.indexOf('?') >= 0
+              || sDenominatorFormat.indexOf('?') >= 0 )
+                sDiv.insert(0, ' ');
         }
         else
         {
@@ -2546,18 +2569,43 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
     else
     {
         bRes |= ImpNumberFill(sFrac, fNumber, k, j, nIx, NF_SYMBOLTYPE_FRACBLANK);
-        bCont = false;  // there is no main number?
+        bCont = false;  // there is no integer part?
         if (rInfo.nTypeArray[j] == NF_SYMBOLTYPE_FRACBLANK)
         {
-            sFrac.insert(0, rInfo.sStrArray[j]);
             if ( j )
             {
+                if ( bHideFraction )
+                {   // '?' in any format force display of blank as delimiter
+                    if ( sIntegerFormat.indexOf('?') >= 0
+                      || sNumeratorFormat.indexOf('?') >= 0
+                      || sDenominatorFormat.indexOf('?') >= 0 )
+                    {
+                        for (sal_uInt16 i = 0; i < rInfo.sStrArray[j].getLength(); i++)
+                            sFrac.insert(0, ' ');
+                    }
+                }
+                else
+                {
+                    if ( fNum != 0.0 || sIntegerFormat.indexOf('0') >= 0 )
+                        sFrac.insert(0, rInfo.sStrArray[j]); // insert Blank string only if there are both integer and fraction
+                    else
+                    {
+                        if ( sIntegerFormat.indexOf('?') >= 0
+                          || sNumeratorFormat.indexOf('?') >= 0 )
+                        {
+                            for (sal_uInt16 i = 0; i < rInfo.sStrArray[j].getLength(); i++)
+                                sFrac.insert(0, ' ');
+                        }
+                    }
+                }
                 j--;
-                bCont = true;  // Yes, there is a main number
+                bCont = true;  // Yes, there is an integer
             }
+            else
+                sFrac.insert(0, rInfo.sStrArray[j]);
         }
     }
-    // Continue main number
+    // Continue integer part
     if ( !bCont )
     {
         sStr.truncate();


More information about the Libreoffice-commits mailing list