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; } }