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

Laurent Balland-Poirier laurent.balland-poirier at laposte.net
Fri Jul 15 19:35:12 UTC 2016


 svl/source/numbers/zformat.cxx   |   16 +++++++++++-----
 svl/source/numbers/zforscan.cxx  |    4 ----
 xmloff/source/style/xmlnumfe.cxx |    5 +++--
 3 files changed, 14 insertions(+), 11 deletions(-)

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

    tdf#100755 Allow '0' for denominator symbol
    
    Fraction number format
    Accept '0' in numerator and denominator format: 0 0/0
    Represent integer 3 as: 3 0/1
    Load and save format to Excel
    As it cannot (yet) be saved in ODF, replace 0 by ? during save to ODF
    
    Change-Id: I4721a751431d3f9b903b369d199146ddfb76b43d
    Reviewed-on: https://gerrit.libreoffice.org/27062
    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 1350525..f3321da 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -2499,11 +2499,15 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
         sStr.appendAscii( aBuf );
         impTransliterate(sStr, NumFor[nIx].GetNatNum());
     }
-    if (rInfo.nCntPre > 0 && nFrac == 0)
+    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) );
+    if ( bHideFraction )
     {
         sDiv.truncate();
     }
-    else
+    else  // if there are some '0' in format, force display of fraction
     {
         sFrac = ImpIntToString( nIx, nFrac );
         sDiv = ImpIntToString( nIx, nDiv );
@@ -2517,7 +2521,7 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
     bool bCont = true;
     if (rInfo.nTypeArray[j] == NF_SYMBOLTYPE_FRAC)
     {
-        if (rInfo.nCntPre > 0 && nFrac == 0)
+        if ( bHideFraction )
         {
             sDiv.insert(0, ' ');
         }
@@ -4306,8 +4310,10 @@ void SvNumberformat::GetNumForInfo( sal_uInt16 nNumFor, short& rScannedType,
                     nAnzLeading++;
                 }
             }
-            else if (nType == NF_SYMBOLTYPE_DECSEP || nType == NF_SYMBOLTYPE_EXP)
-            {
+            else if (nType == NF_SYMBOLTYPE_DECSEP
+                  || nType == NF_SYMBOLTYPE_EXP
+                  || nType == NF_SYMBOLTYPE_FRACBLANK)  // Fraction: stop after integer part,
+            {                                           // do not count '0' of fraction
                 bStop = true;
             }
             i++;
diff --git a/svl/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx
index 8025ae6..1e4ba47 100644
--- a/svl/source/numbers/zforscan.cxx
+++ b/svl/source/numbers/zforscan.cxx
@@ -1740,10 +1740,6 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
                     {
                         return nPos;                    // Error
                     }
-                    else if (bFrac && cHere == '0')
-                    {
-                        return nPos;                    // Denominator is 0
-                    }
                     nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
                     nPos = nPos + rStr.getLength();
                     i++;
diff --git a/xmloff/source/style/xmlnumfe.cxx b/xmloff/source/style/xmlnumfe.cxx
index 3fd0d5c..70ac995 100644
--- a/xmloff/source/style/xmlnumfe.cxx
+++ b/xmloff/source/style/xmlnumfe.cxx
@@ -731,13 +731,14 @@ void SvXMLNumFmtExport::WriteFractionElement_Impl(
 {
     FinishTextElement_Impl();
     sal_Int32 nMaxNumeratorDigits = aNumeratorString.getLength();
-    sal_Int32 nMinNumeratorDigits = aNumeratorString.indexOf('?');
+    // As '0' cannot (yet) be saved in extended ODF, replace them by '?'
+    sal_Int32 nMinNumeratorDigits = aNumeratorString.replaceAll("0","?").indexOf('?');
     if ( nMinNumeratorDigits >= 0 )
         nMinNumeratorDigits = nMaxNumeratorDigits - nMinNumeratorDigits;
     else
         nMinNumeratorDigits = 0;
     sal_Int32 nMaxDenominatorDigits = aDenominatorString.getLength();
-    sal_Int32 nMinDenominatorDigits = aDenominatorString.indexOf('?');
+    sal_Int32 nMinDenominatorDigits = aDenominatorString.replaceAll("0","?").indexOf('?');
     if ( nMinDenominatorDigits >= 0 )
         nMinDenominatorDigits = nMaxDenominatorDigits - nMinDenominatorDigits;
     else


More information about the Libreoffice-commits mailing list