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 <erack@redhat.com>
(cherry picked from commit dc9b8c31aaf72812dc205f610638098898a4cde7)
(cherry picked from commit 96fb093856dd84fdab6b8989884e5632139dec07)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150093
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx
index 19a8c2b..1eab02e 100644
--- a/svl/qa/unit/svl.cxx
+++ b/svl/qa/unit/svl.cxx
@@ -1453,6 +1453,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 a4756f4..0ddd6e0 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -2800,9 +2800,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);
@@ -2856,7 +2857,8 @@ void SvNumberformat::ImpGetFractionElements ( double& fNumber, sal_uInt16 nIx,
    if (nFrac >= nDiv)
    {
        ++fIntPart;
        nFrac = nDiv = 0;
        nFrac = 0;
        nDiv = ( nForcedDiv > 0 ) ? nForcedDiv : 1;
    }
}