From fb07ca38af165b1e367aea04aa626e073b341c8f Mon Sep 17 00:00:00 2001 From: Laurent Balland Date: Fri, 13 Feb 2026 08:01:06 +0100 Subject: [PATCH] tdf#170670 NumberFormat: fix blank width string treatment In case of 2 characters string text, with a delimiter as text and a blank width string like "-"_) the delimiter is now treated as text Add qa test with format of bug report: [>0]#,##0_);[<0](#,##0);"-"_) Change-Id: Idd4542bd186c6b6b348f6716bee2fd5055f2c83f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199314 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- .../unit/data/ods/tdf170670-Blank-width-char.ods | Bin 0 -> 7751 bytes sc/qa/unit/subsequent_export_test4.cxx | 10 ++++++++++ xmloff/source/style/xmlnumfi.cxx | 7 ++++--- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 sc/qa/unit/data/ods/tdf170670-Blank-width-char.ods diff --git a/sc/qa/unit/data/ods/tdf170670-Blank-width-char.ods b/sc/qa/unit/data/ods/tdf170670-Blank-width-char.ods new file mode 100644 index 0000000000000000000000000000000000000000..50918deb662f7835184efe19e6e0ce3c84c15288 GIT binary patch literal 7751 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 H0]#,##0_);[<0](#,##0);\"-\"_)"_ustr); + + // save to XLSX and reload + saveAndReload(TestFilter::XLSX); + lcl_TestNumberFormat(*getScDoc(), u"#,##0_);\\(#,##0\\);-_)"_ustr); } CPPUNIT_TEST_FIXTURE(ScExportTest4, testEmbeddedTextInDecimal) diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx index 2b560814405f..24f8469d9095 100644 --- a/xmloff/source/style/xmlnumfi.cxx +++ b/xmloff/source/style/xmlnumfi.cxx @@ -530,13 +530,13 @@ static bool lcl_ValidChar( sal_Unicode cChar, const SvXMLNumFormatContext& rPare return false; } -static void lcl_EnquoteIfNecessary( OUStringBuffer& rContent, const SvXMLNumFormatContext& rParent ) +static void lcl_EnquoteIfNecessary( OUStringBuffer& rContent, const SvXMLNumFormatContext& rParent, const bool bIsBlankWidthStringEmpty = true ) { bool bQuote = true; sal_Int32 nLength = rContent.getLength(); const SvXMLStylesTokens nFormatType = rParent.GetType(); - if (nFormatType != SvXMLStylesTokens::BOOLEAN_STYLE && + if (nFormatType != SvXMLStylesTokens::BOOLEAN_STYLE && bIsBlankWidthStringEmpty && ((nLength == 1 && lcl_ValidChar( rContent[0], rParent)) || (nLength == 2 && ((rContent[0] == ' ' && rContent[1] == '-') || @@ -547,6 +547,7 @@ static void lcl_EnquoteIfNecessary( OUStringBuffer& rContent, const SvXMLNumForm // Or space followed by minus (used in currency formats) that would // lead to almost duplicated formats with built-in formats just with // the difference of quotes. + // tdf#170670: except if it is inside a blank width string bQuote = false; } else if ( nFormatType == SvXMLStylesTokens::PERCENTAGE_STYLE && nLength > 1 ) @@ -974,7 +975,7 @@ void SvXMLNumFmtElementContext::endFastElement(sal_Int32 ) } if ( !aContent.isEmpty() ) { - lcl_EnquoteIfNecessary( aContent, rParent ); + lcl_EnquoteIfNecessary( aContent, rParent, sBlankWidthString.isEmpty() ); if ( !sBlankWidthString.isEmpty() ) { lcl_InsertBlankWidthChars( sBlankWidthString, aContent );