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

Reply via email to