include/svl/nfengine.hxx | 1 include/svl/zformat.hxx | 12 ++++++--- svl/source/numbers/zforlist.cxx | 5 ++++ svl/source/numbers/zformat.cxx | 50 +++++++++++++++++++++------------------- 4 files changed, 41 insertions(+), 27 deletions(-)
New commits: commit 693f44f9238a5cebee074fbe901687ac59a342f7 Author: Caolán McNamara <[email protected]> AuthorDate: Mon Feb 16 21:36:22 2026 +0000 Commit: Caolán McNamara <[email protected]> CommitDate: Thu Feb 19 09:31:38 2026 +0100 tdf#167636 GetOutputString should be using the scanner from LanguageData and not the shared one, bubble that around more explicitly Change-Id: Iff6462dafd2baa75253ad9929f9cbf53a178e9b9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199558 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> diff --git a/include/svl/nfengine.hxx b/include/svl/nfengine.hxx index 8b1309e5a2e4..fce4570d6ad3 100644 --- a/include/svl/nfengine.hxx +++ b/include/svl/nfengine.hxx @@ -135,6 +135,7 @@ public: sal_uInt16 GetCurrencyFormatStrings(NfWSStringsDtor&, const NfCurrencyEntry&, bool bBank) const; void ChangeStandardPrec(short nPrec); + sal_uInt16 GetStandardPrec() const; sal_uInt16 ExpandTwoDigitYear(sal_uInt16 nYear) const; diff --git a/include/svl/zformat.hxx b/include/svl/zformat.hxx index 712bb0dace5b..e3bbe5a3bd39 100644 --- a/include/svl/zformat.hxx +++ b/include/svl/zformat.hxx @@ -613,13 +613,17 @@ private: // standard number output SVL_DLLPRIVATE void ImpGetOutputStandard(double& fNumber, OUString& OutString, - const NativeNumberWrapper& rNatNum) const; + const NativeNumberWrapper& rNatNum, + const SvNFLanguageData& rCurrentLang) const; SVL_DLLPRIVATE void ImpGetOutputStandard(double& fNumber, OUStringBuffer& OutString, - const NativeNumberWrapper& rNatNum) const; + const NativeNumberWrapper& rNatNum, + const SvNFLanguageData& rCurrentLang) const; SVL_DLLPRIVATE void ImpGetOutputStdToPrecision(double& rNumber, OUString& rOutString, sal_uInt16 nPrecision, - const NativeNumberWrapper& rNatNum) const; + const NativeNumberWrapper& rNatNum, + const SvNFLanguageData& rCurrentLang) const; // numbers in input line - SVL_DLLPRIVATE void ImpGetOutputInputLine( double fNumber, OUString& OutString ) const; + SVL_DLLPRIVATE void ImpGetOutputInputLine( double fNumber, OUString& OutString, + const SvNFLanguageData& rCurrentLang ) const; // check subcondition // OP undefined => -1 diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx index 2ae7abe17465..2537a718de97 100644 --- a/svl/source/numbers/zforlist.cxx +++ b/svl/source/numbers/zforlist.cxx @@ -509,6 +509,11 @@ void SvNFLanguageData::ChangeStandardPrec(short nPrec) pFormatScanner->ChangeStandardPrec(nPrec); } +sal_uInt16 SvNFLanguageData::GetStandardPrec() const +{ + return pFormatScanner->GetStandardPrec(); +} + const Date& SvNumberFormatter::GetNullDate() const { ::osl::MutexGuard aGuard( GetInstanceMutex() ); diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx index 2443bcff52cc..30d870860f11 100644 --- a/svl/source/numbers/zformat.cxx +++ b/svl/source/numbers/zformat.cxx @@ -2039,28 +2039,30 @@ OUString SvNumberformat::StripNewCurrencyDelimiters( const OUString& rStr ) } void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUStringBuffer& rOutString, - const NativeNumberWrapper& rNatNum) const + const NativeNumberWrapper& rNatNum, + const SvNFLanguageData& rCurrentLang) const { OUString sTemp; - ImpGetOutputStandard(fNumber, sTemp, rNatNum); + ImpGetOutputStandard(fNumber, sTemp, rNatNum, rCurrentLang); rOutString = sTemp; } void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUString& rOutString, - const NativeNumberWrapper& rNatNum) const + const NativeNumberWrapper& rNatNum, + const SvNFLanguageData& rCurrentLang) const { - sal_uInt16 nStandardPrec = rScan.GetStandardPrec(); + sal_uInt16 nStandardPrec = rCurrentLang.GetStandardPrec(); if ( fabs(fNumber) > EXP_ABS_UPPER_BOUND ) { nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals rOutString = ::rtl::math::doubleToUString( fNumber, rtl_math_StringFormat_E2, nStandardPrec /*2*/, - GetCurrentLanguageData().GetNumDecimalSep()[0]); + rCurrentLang.GetNumDecimalSep()[0]); } else { - ImpGetOutputStdToPrecision(fNumber, rOutString, nStandardPrec, rNatNum); + ImpGetOutputStdToPrecision(fNumber, rOutString, nStandardPrec, rNatNum, rCurrentLang); } } @@ -2117,7 +2119,8 @@ void impTransliterate(OUStringBuffer& rStr, const SvNumberNatNum& rNum, const Na } void SvNumberformat::ImpGetOutputStdToPrecision(double& rNumber, OUString& rOutString, sal_uInt16 nPrecision, - const NativeNumberWrapper& rNatNum) const + const NativeNumberWrapper& rNatNum, + const SvNFLanguageData& rCurrentLang) const { // Make sure the precision doesn't go over the maximum allowable precision. nPrecision = ::std::min(UPPER_PRECISION, nPrecision); @@ -2129,7 +2132,7 @@ void SvNumberformat::ImpGetOutputStdToPrecision(double& rNumber, OUString& rOutS rOutString = ::rtl::math::doubleToUString( rNumber, rtl_math_StringFormat_F, nPrecision /*2*/, - GetCurrentLanguageData().GetNumDecimalSep()[0], true ); + rCurrentLang.GetNumDecimalSep()[0], true ); if (rOutString[0] == '-' && checkForAll0s(rOutString, 1)) { rOutString = comphelper::string::stripStart(rOutString, '-'); // not -0 @@ -2137,7 +2140,8 @@ void SvNumberformat::ImpGetOutputStdToPrecision(double& rNumber, OUString& rOutS rOutString = ::impTransliterate(rOutString, NumFor[0].GetNatNum(), rNatNum); } -void SvNumberformat::ImpGetOutputInputLine(double fNumber, OUString& OutString) const +void SvNumberformat::ImpGetOutputInputLine(double fNumber, OUString& OutString, + const SvNFLanguageData& rCurrentLang) const { bool bModified = false; if ( (eType & SvNumFormatType::PERCENT) && (fabs(fNumber) < D_MAX_D_BY_100)) @@ -2160,7 +2164,7 @@ void SvNumberformat::ImpGetOutputInputLine(double fNumber, OUString& OutString) OutString = ::rtl::math::doubleToUString( fNumber, rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, - GetCurrentLanguageData().GetNumDecimalSep()[0], true ); + rCurrentLang.GetNumDecimalSep()[0], true ); if ( eType & SvNumFormatType::PERCENT && bModified) { @@ -2461,7 +2465,7 @@ bool SvNumberformat::GetOutputString(double fNumber, sal_uInt16 nCharCount, OUSt // Subtract the decimal point. --nPrec; } - ImpGetOutputStdToPrecision(fNumber, rOutString, nPrec, rNatNum); + ImpGetOutputStdToPrecision(fNumber, rOutString, nPrec, rNatNum, GetCurrentLanguageData()); if (rOutString.getLength() > nCharCount) { // String still wider than desired. Switch to scientific notation. @@ -2520,22 +2524,22 @@ bool SvNumberformat::GetOutputString(double fNumber, OUStringBuffer sBuff(64); if (eType & SvNumFormatType::TEXT) { - ImpGetOutputStandard(fNumber, sBuff, rNatNum); + ImpGetOutputStandard(fNumber, sBuff, rNatNum, rCurrentLang); OutString = sBuff.makeStringAndClear(); return false; } bool bHadStandard = false; if (bStandard) // Individual standard formats { - if (rScan.GetStandardPrec() == SvNumberFormatter::INPUTSTRING_PRECISION) // All number format InputLine + if (rCurrentLang.GetStandardPrec() == SvNumberFormatter::INPUTSTRING_PRECISION) // All number format InputLine { - ImpGetOutputInputLine(fNumber, OutString); + ImpGetOutputInputLine(fNumber, OutString, rCurrentLang); return false; } switch (eType) { case SvNumFormatType::NUMBER: // Standard number format - if (rScan.GetStandardPrec() == SvNumberFormatter::UNLIMITED_PRECISION) + if (rCurrentLang.GetStandardPrec() == SvNumberFormatter::UNLIMITED_PRECISION) { if (std::signbit(fNumber)) { @@ -2568,23 +2572,23 @@ bool SvNumberformat::GetOutputString(double fNumber, OutString = ::rtl::math::doubleToUString( fNumber, rtl_math_StringFormat_F, rtl_math_DecimalPlaces_Max, - GetCurrentLanguageData().GetNumDecimalSep()[0], true); + rCurrentLang.GetNumDecimalSep()[0], true); else OutString = ::rtl::math::doubleToUString( fNumber, rtl_math_StringFormat_E2, rtl_math_DecimalPlaces_Max, - GetCurrentLanguageData().GetNumDecimalSep()[0], true); + rCurrentLang.GetNumDecimalSep()[0], true); } else { OutString = ::rtl::math::doubleToUString( fNumber, rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, - GetCurrentLanguageData().GetNumDecimalSep()[0], true); + rCurrentLang.GetNumDecimalSep()[0], true); } return false; } - ImpGetOutputStandard(fNumber, sBuff, rNatNum); + ImpGetOutputStandard(fNumber, sBuff, rNatNum, rCurrentLang); bHadStandard = true; break; case SvNumFormatType::DATE: @@ -2620,7 +2624,7 @@ bool SvNumberformat::GetOutputString(double fNumber, } else if (nCnt == 0) // Else Standard Format { - ImpGetOutputStandard(fNumber, sBuff, rNatNum); + ImpGetOutputStandard(fNumber, sBuff, rNatNum, rCurrentLang); OutString = sBuff.makeStringAndClear(); return false; } @@ -4620,7 +4624,7 @@ bool SvNumberformat::ImpDecimalFill(const NativeNumberWrapper& rNatNum, case NF_KEY_GENERAL: // Standard in the String { OUStringBuffer sNum; - ImpGetOutputStandard(rNumber, sNum, rNatNum); + ImpGetOutputStandard(rNumber, sNum, rNatNum, GetCurrentLanguageData()); sNum.stripStart('-'); sStr.insert(k, sNum); break; @@ -4788,7 +4792,7 @@ bool SvNumberformat::ImpNumberFillWithThousands( const NativeNumberWrapper& rNat case NF_KEY_GENERAL: // "General" in string { OUStringBuffer sNum; - ImpGetOutputStandard(rNumber, sNum, rNatNum); + ImpGetOutputStandard(rNumber, sNum, rNatNum, GetCurrentLanguageData()); sNum.stripStart('-'); sBuff.insert(k, sNum); break; @@ -4926,7 +4930,7 @@ bool SvNumberformat::ImpNumberFill( const NativeNumberWrapper& rNatNum, { OUStringBuffer sNum; bFoundNumber = true; - ImpGetOutputStandard(rNumber, sNum, rNatNum); + ImpGetOutputStandard(rNumber, sNum, rNatNum, GetCurrentLanguageData()); sNum.stripStart('-'); sBuff.insert(k, sNum); }
