svl/qa/unit/svl.cxx            |   12 ++++++++++++
 svl/source/numbers/zformat.cxx |    8 +++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

New commits:
commit 072f84001b2d28915085909a4d9a5a52bd7f6b61
Author:     Laurent Balland <laurent.ball...@mailo.fr>
AuthorDate: Sun Mar 19 21:45:52 2023 +0100
Commit:     Adolfo Jayme Barrientos <fit...@ubuntu.com>
CommitDate: Fri Apr 7 03:04:50 2023 +0200

    tdf#153887 Fraction number format: avoid 0/0
    
    If round value is an integer and there is no integer part in the number
    format, then nDiv was wrongly forced to 0.
    Add corresponding unit tests.
    
    Change-Id: Ib69393eca8f6c2bdda0eacfc83637ab0c971ff2d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149118
    Tested-by: Jenkins
    Reviewed-by: Eike Rathke <er...@redhat.com>
    (cherry picked from commit dc9b8c31aaf72812dc205f610638098898a4cde7)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150085
    Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com>

diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx
index 29bbde9b999d..2b9672d7602d 100644
--- a/svl/qa/unit/svl.cxx
+++ b/svl/qa/unit/svl.cxx
@@ -1448,6 +1448,18 @@ void Test::testUserDefinedNumberFormats()
         sExpected = "-575 540/697";
         checkPreviewString(aFormatter, sCode, -575.774749601315, eLang, 
sExpected);
     }
+    {  // tdf#153887: integer value without integer part displayed
+        sCode = "#/?";
+        sExpected = "2/1";
+        checkPreviewString(aFormatter, sCode, 1.95, eLang, sExpected);
+        checkPreviewString(aFormatter, sCode, 2.00, eLang, sExpected);
+        checkPreviewString(aFormatter, sCode, 2.05, eLang, sExpected);
+        sCode = "0/8";
+        sExpected = "16/8";
+        checkPreviewString(aFormatter, sCode, 1.95, eLang, sExpected);
+        checkPreviewString(aFormatter, sCode, 2.00, eLang, sExpected);
+        checkPreviewString(aFormatter, sCode, 2.05, eLang, sExpected);
+    }
     {  // tdf#102507: left alignment of denominator
         sCode = "# ?/???";
         sExpected = "3 1/2  ";
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index eb790ee425b0..a19b08375ecd 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -2835,9 +2835,10 @@ void SvNumberformat::ImpGetFractionElements ( double& 
fNumber, sal_uInt16 nIx,
     fIntPart = floor(fNumber); // Integral part
     fNumber -= fIntPart;         // Fractional part
     const ImpSvNumberformatInfo& rInfo = NumFor[nIx].Info();
-    nDiv = lcl_GetDenominatorString( rInfo, NumFor[nIx].GetCount() ).toInt32();
-    if( nDiv > 0 )
+    sal_Int64 nForcedDiv = lcl_GetDenominatorString( rInfo, 
NumFor[nIx].GetCount() ).toInt32();
+    if( nForcedDiv > 0 )
     {   // Forced Denominator
+        nDiv = nForcedDiv;
         nFrac = static_cast<sal_Int64>(floor ( fNumber * nDiv ));
         double fFracNew = static_cast<double>(nFrac) / 
static_cast<double>(nDiv);
         double fFracNew1 = static_cast<double>(nFrac + 1) / 
static_cast<double>(nDiv);
@@ -2891,7 +2892,8 @@ void SvNumberformat::ImpGetFractionElements ( double& 
fNumber, sal_uInt16 nIx,
     if (nFrac >= nDiv)
     {
         ++fIntPart;
-        nFrac = nDiv = 0;
+        nFrac = 0;
+        nDiv = ( nForcedDiv > 0 ) ? nForcedDiv : 1;
     }
 }
 

Reply via email to