basic/source/sbx/sbxcurr.cxx |   16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

New commits:
commit bb169c209cddc1bfe5c383b18f0dd514ea1b74fd
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Mon Sep 2 12:51:28 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Mon Sep 2 12:53:32 2024 +0200

    Fix ImpCurrencyToString to handle SAL_MIN_INT64
    
    It can't be negated; so avoid the negation, and skip the minus in the
    string result. Also, avoid needless creation of OUString.
    
    Change-Id: If867c189b2ffd2794a58f66fd2511004ed4fc25a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172733
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins

diff --git a/basic/source/sbx/sbxcurr.cxx b/basic/source/sbx/sbxcurr.cxx
index be4fed2b7bdd..5fcab97243ca 100644
--- a/basic/source/sbx/sbxcurr.cxx
+++ b/basic/source/sbx/sbxcurr.cxx
@@ -35,18 +35,20 @@ static OUString ImpCurrencyToString( sal_Int64 rVal )
     sal_Unicode cDecimalSep, cThousandSepDummy, cDecimalSepAltDummy;
     ImpGetIntntlSep(cDecimalSep, cThousandSepDummy, cDecimalSepAltDummy);
 
+    auto strNum = OUString::number(rVal);
+    std::u16string_view aAbsStr(strNum);
     OUStringBuffer aBuf(22);
     if (rVal < 0)
     {
         aBuf.append('-');
-        rVal = -rVal;
+        assert(aAbsStr[0] == '-');
+        aAbsStr = aAbsStr.substr(1); // skip the minus
     }
-    OUString aAbsStr = OUString::number(rVal);
-    sal_Int32 hasFractDigits = std::min(aAbsStr.getLength(), sal_Int32(4));
-    sal_Int32 hasWholeDigits = aAbsStr.getLength() - hasFractDigits;
+    size_t hasFractDigits = std::min(aAbsStr.length(), size_t(4));
+    size_t hasWholeDigits = aAbsStr.length() - hasFractDigits;
 
     if (hasWholeDigits > 0)
-        aBuf.append(aAbsStr.subView(0, hasWholeDigits));
+        aBuf.append(aAbsStr.substr(0, hasWholeDigits));
     else
         aBuf.append('0');
     aBuf.append(cDecimalSep);
@@ -60,9 +62,9 @@ static OUString ImpCurrencyToString( sal_Int64 rVal )
     // ---   ---------  ---------
     // 0     0.0000     0
     // 0.1   0.1000     0.1
-    for (sal_Int32 i = 4; i > hasFractDigits; --i)
+    for (size_t i = 4; i > hasFractDigits; --i)
         aBuf.append('0');
-    aBuf.append(aAbsStr.subView(aAbsStr.getLength() - hasFractDigits, 
hasFractDigits));
+    aBuf.append(aAbsStr.substr(aAbsStr.length() - hasFractDigits, 
hasFractDigits));
 
     return aBuf.makeStringAndClear();
 }

Reply via email to