summaryrefslogtreecommitdiff
path: root/svl
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2018-03-02 17:15:47 +0100
committerAndras Timar <andras.timar@collabora.com>2018-03-19 10:20:31 +0100
commit43d9f1df1e042b46beff0c2da01d8dd366398ecc (patch)
tree55b6c783011b30b17b43ca176893a3c5fb94348a /svl
parent7ae13de34a8bc7be434d2994e7dfbf9ee1e004b6 (diff)
Resolves: tdf#115351 convert boolean equivalent format codes to proper Boolean
Because Excel does not know a Boolean number format, BOOLEAN is saved to Excel as "TRUE";"TRUE";"FALSE" with implicit conditions [>0] and [<0]. This when loaded has no boolean property. Then saved to ODF it is loaded as [>0]"TRUE";[<0]"TRUE";"FALSE" with explicit conditions, which has identical meaning. Convert both equivalent format codes to proper BOOLEAN when reading. Locale dependent representations are treated the same, e.g. "WAHR";"WAHR";"FALSCH" Reviewed-on: https://gerrit.libreoffice.org/50642 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins <ci@libreoffice.org> (cherry picked from commit ce4fc2fc08be8ea2773194e303ed42d2579e93a0) Backported. Conflicts: svl/source/numbers/zforscan.cxx Change-Id: I49383d71fce972fdd7ad9b19ce3bc150d02aba62 Reviewed-on: https://gerrit.libreoffice.org/50645 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Meeks <michael.meeks@collabora.com> (cherry picked from commit feb3da3dc53c9b702e39ec12b037b07a67bedcbd)
Diffstat (limited to 'svl')
-rw-r--r--svl/source/numbers/zformat.cxx2
-rw-r--r--svl/source/numbers/zforscan.cxx20
-rw-r--r--svl/source/numbers/zforscan.hxx5
3 files changed, 27 insertions, 0 deletions
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index d3e48317f4d0..8614c412bfd5 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -761,6 +761,8 @@ SvNumberformat::SvNumberformat(OUString& rString,
, bAdditionalBuiltin( false )
, bStarFlag( false )
{
+ rScan.ReplaceBooleanEquivalent( rString);
+
OUStringBuffer sBuff(rString);
// If the group (AKA thousand) separator is a No-Break Space (French)
diff --git a/svl/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx
index 3687ebc4756b..da88794a40cf 100644
--- a/svl/source/numbers/zforscan.cxx
+++ b/svl/source/numbers/zforscan.cxx
@@ -553,6 +553,16 @@ void ImpSvNumberformatScan::SetDependentKeywords()
InitSpecialKeyword( NF_KEY_TRUE );
InitSpecialKeyword( NF_KEY_FALSE );
+ // Boolean equivalent format codes that are written to Excel files, may
+ // have been written to ODF as well, specifically if such loaded Excel file
+ // was saved as ODF, and shall result in proper Boolean again.
+ // "TRUE";"TRUE";"FALSE"
+ sBooleanEquivalent1 = "\"" + sKeyword[NF_KEY_TRUE] + "\";\"" +
+ sKeyword[NF_KEY_TRUE] + "\";\"" + sKeyword[NF_KEY_FALSE] + "\"";
+ // [>0]"TRUE";[<0]"TRUE";"FALSE"
+ sBooleanEquivalent2 = "[>0]\"" + sKeyword[NF_KEY_TRUE] + "\";[<0]\"" +
+ sKeyword[NF_KEY_TRUE] + "\";\"" + sKeyword[NF_KEY_FALSE] + "\"";
+
// compatibility currency strings
InitCompatCur();
}
@@ -3302,4 +3312,14 @@ void ImpSvNumberformatScan::CopyInfo(ImpSvNumberformatInfo* pInfo, sal_uInt16 nC
pInfo->nCntExp = nCntExp;
}
+void ImpSvNumberformatScan::ReplaceBooleanEquivalent( OUString& rString )
+{
+ InitKeywords();
+ /* TODO: compare case insensitive? Or rather leave as is and case not
+ * matching indicates user supplied on purpose? Written to file / generated
+ * was always uppercase. */
+ if (rString == sBooleanEquivalent1 || rString == sBooleanEquivalent2)
+ rString = GetKeywords()[NF_KEY_BOOLEAN];
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svl/source/numbers/zforscan.hxx b/svl/source/numbers/zforscan.hxx
index e5eeab899d24..79bc6e7512d1 100644
--- a/svl/source/numbers/zforscan.hxx
+++ b/svl/source/numbers/zforscan.hxx
@@ -143,6 +143,9 @@ public:
return sCurString;
}
+ /// Replace Boolean equivalent format codes with proper Boolean format.
+ void ReplaceBooleanEquivalent( OUString& rString );
+
void SetConvertMode(LanguageType eTmpLge, LanguageType eNewLge,
bool bSystemToSystem = false, bool bForExcelExport = false)
{
@@ -203,6 +206,8 @@ private: // Private section
OUString sCurSymbol; // Currency symbol for compatibility format codes
OUString sCurString; // Currency symbol in upper case
OUString sCurAbbrev; // Currency abbreviation
+ OUString sBooleanEquivalent1; // "TRUE";"TRUE";"FALSE"
+ OUString sBooleanEquivalent2; // [>0]"TRUE";[<0]"TRUE";"FALSE"
static const OUString sErrStr; // String for error output
bool bConvertMode; // Set in the convert mode