[Libreoffice-commits] core.git: 26 commits - basic/source i18npool/inc i18npool/source include/svl include/unotools offapi/com sc/inc sc/qa sc/source svl/source svx/source sw/source unotools/source vcl/source
Eike Rathke
erack at redhat.com
Fri Oct 27 16:30:12 UTC 2017
basic/source/sbx/sbxscan.cxx | 34 ++--
i18npool/inc/cclass_unicode.hxx | 5
i18npool/inc/collatorImpl.hxx | 4
i18npool/inc/numberformatcode.hxx | 4
i18npool/inc/transliterationImpl.hxx | 4
i18npool/source/characterclassification/cclass_unicode_parser.cxx | 22 ++
i18npool/source/collator/collatorImpl.cxx | 4
i18npool/source/localedata/LocaleNode.cxx | 19 +-
i18npool/source/localedata/data/ar_DZ.xml | 1
i18npool/source/localedata/data/ar_EG.xml | 1
i18npool/source/localedata/data/ar_LB.xml | 1
i18npool/source/localedata/data/ar_SA.xml | 1
i18npool/source/localedata/data/ar_TN.xml | 1
i18npool/source/localedata/data/fa_IR.xml | 1
i18npool/source/localedata/data/locale.dtd | 3
i18npool/source/numberformatcode/numberformatcode.cxx | 4
i18npool/source/transliteration/transliterationImpl.cxx | 4
include/svl/zforlist.hxx | 7
include/unotools/localedatawrapper.hxx | 74 +++++++++-
offapi/com/sun/star/i18n/LocaleItem.idl | 12 +
sc/inc/stringutil.hxx | 3
sc/qa/unit/ucalc.cxx | 1
sc/source/core/data/column3.cxx | 12 -
sc/source/core/data/table3.cxx | 2
sc/source/core/tool/compiler.cxx | 17 +-
sc/source/core/tool/formulaopt.cxx | 8 -
sc/source/core/tool/stringutil.cxx | 6
sc/source/ui/cctrl/editfield.cxx | 7
sc/source/ui/docshell/docsh6.cxx | 4
sc/source/ui/miscdlgs/solveroptions.cxx | 8 -
sc/source/ui/sidebar/AlignmentPropertyPanel.cxx | 3
svl/source/numbers/zforfind.cxx | 15 +-
svl/source/numbers/zforlist.cxx | 13 +
svx/source/sidebar/possize/PosSizePropertyPanel.cxx | 3
svx/source/sidebar/shadow/ShadowPropertyPanel.cxx | 3
svx/source/svdraw/svdomeas.cxx | 9 -
sw/source/core/bastyp/calc.cxx | 5
sw/source/core/doc/docsort.cxx | 5
unotools/source/i18n/localedatawrapper.cxx | 58 ++++++-
vcl/source/control/field.cxx | 3
vcl/source/control/longcurr.cxx | 3
41 files changed, 293 insertions(+), 101 deletions(-)
New commits:
commit 89e0a9183e7b21596bcd5504b104bf816f1d3ef3
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:27:44 2017 +0200
Resolves: tdf#81671 add DecimalSeparatorAlternative to ar-* and fa-IR
In locales that use '٫' U+066B ARABIC DECIMAL SEPARATOR
additionally have '.' normal dot as input separator.
Change-Id: Icb3f42374776e3fc65af3270abaca26ea5b24082
diff --git a/i18npool/source/localedata/data/ar_DZ.xml b/i18npool/source/localedata/data/ar_DZ.xml
index 16362ced8c01..4cb4d155018b 100644
--- a/i18npool/source/localedata/data/ar_DZ.xml
+++ b/i18npool/source/localedata/data/ar_DZ.xml
@@ -33,6 +33,7 @@
<DateSeparator>/</DateSeparator>
<ThousandSeparator> </ThousandSeparator>
<DecimalSeparator>٫</DecimalSeparator>
+ <DecimalSeparatorAlternative>.</DecimalSeparatorAlternative>
<TimeSeparator>:</TimeSeparator>
<Time100SecSeparator>٫</Time100SecSeparator>
<ListSeparator>;</ListSeparator>
diff --git a/i18npool/source/localedata/data/ar_EG.xml b/i18npool/source/localedata/data/ar_EG.xml
index 4dfe9bec8ff1..5bcb4b689c30 100644
--- a/i18npool/source/localedata/data/ar_EG.xml
+++ b/i18npool/source/localedata/data/ar_EG.xml
@@ -33,6 +33,7 @@
<DateSeparator>/</DateSeparator>
<ThousandSeparator>٬</ThousandSeparator>
<DecimalSeparator>٫</DecimalSeparator>
+ <DecimalSeparatorAlternative>.</DecimalSeparatorAlternative>
<TimeSeparator>:</TimeSeparator>
<Time100SecSeparator>.</Time100SecSeparator>
<ListSeparator>;</ListSeparator>
diff --git a/i18npool/source/localedata/data/ar_LB.xml b/i18npool/source/localedata/data/ar_LB.xml
index 9499dfb8ba48..64ac706e8fa4 100644
--- a/i18npool/source/localedata/data/ar_LB.xml
+++ b/i18npool/source/localedata/data/ar_LB.xml
@@ -33,6 +33,7 @@
<DateSeparator>/</DateSeparator>
<ThousandSeparator>٬</ThousandSeparator>
<DecimalSeparator>٫</DecimalSeparator>
+ <DecimalSeparatorAlternative>.</DecimalSeparatorAlternative>
<TimeSeparator>:</TimeSeparator>
<Time100SecSeparator>.</Time100SecSeparator>
<ListSeparator>;</ListSeparator>
diff --git a/i18npool/source/localedata/data/ar_SA.xml b/i18npool/source/localedata/data/ar_SA.xml
index 05f0fb81edb3..f7970ffedd30 100644
--- a/i18npool/source/localedata/data/ar_SA.xml
+++ b/i18npool/source/localedata/data/ar_SA.xml
@@ -33,6 +33,7 @@
<DateSeparator>/</DateSeparator>
<ThousandSeparator>٬</ThousandSeparator>
<DecimalSeparator>٫</DecimalSeparator>
+ <DecimalSeparatorAlternative>.</DecimalSeparatorAlternative>
<TimeSeparator>:</TimeSeparator>
<Time100SecSeparator>.</Time100SecSeparator>
<ListSeparator>;</ListSeparator>
diff --git a/i18npool/source/localedata/data/ar_TN.xml b/i18npool/source/localedata/data/ar_TN.xml
index 014f77524603..ae37a4b84c0f 100644
--- a/i18npool/source/localedata/data/ar_TN.xml
+++ b/i18npool/source/localedata/data/ar_TN.xml
@@ -33,6 +33,7 @@
<DateSeparator>/</DateSeparator>
<ThousandSeparator>٬</ThousandSeparator>
<DecimalSeparator>٫</DecimalSeparator>
+ <DecimalSeparatorAlternative>.</DecimalSeparatorAlternative>
<TimeSeparator>:</TimeSeparator>
<Time100SecSeparator>.</Time100SecSeparator>
<ListSeparator>;</ListSeparator>
diff --git a/i18npool/source/localedata/data/fa_IR.xml b/i18npool/source/localedata/data/fa_IR.xml
index 04b9ac8ffc3a..10157072450e 100644
--- a/i18npool/source/localedata/data/fa_IR.xml
+++ b/i18npool/source/localedata/data/fa_IR.xml
@@ -33,6 +33,7 @@
<DateSeparator>/</DateSeparator>
<ThousandSeparator>٬</ThousandSeparator>
<DecimalSeparator>٫</DecimalSeparator>
+ <DecimalSeparatorAlternative>.</DecimalSeparatorAlternative>
<TimeSeparator>:</TimeSeparator>
<Time100SecSeparator>٫</Time100SecSeparator>
<ListSeparator>;</ListSeparator>
commit 92933ed580628c4e4cf539fc9fd90faaf51e05e6
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:24:01 2017 +0200
Define optional <Separators><DecimalSeparatorAlternative>, tdf#81671
Change-Id: I13d49463aa2fa9975b77d4ee62fcadc36b8317ae
diff --git a/i18npool/source/localedata/data/locale.dtd b/i18npool/source/localedata/data/locale.dtd
index 377df12b9bb8..53736783dd44 100644
--- a/i18npool/source/localedata/data/locale.dtd
+++ b/i18npool/source/localedata/data/locale.dtd
@@ -436,10 +436,11 @@
<!ATTLIST LC_CTYPE %RefLocale;>
<!ATTLIST LC_CTYPE %UNOModule;>
-<!ELEMENT Separators (DateSeparator, ThousandSeparator, DecimalSeparator, TimeSeparator, Time100SecSeparator, ListSeparator, LongDateDayOfWeekSeparator, LongDateDaySeparator, LongDateMonthSeparator, LongDateYearSeparator)>
+<!ELEMENT Separators (DateSeparator, ThousandSeparator, DecimalSeparator, DecimalSeparatorAlternative?, TimeSeparator, Time100SecSeparator, ListSeparator, LongDateDayOfWeekSeparator, LongDateDaySeparator, LongDateMonthSeparator, LongDateYearSeparator)>
<!ELEMENT DateSeparator (#PCDATA)>
<!ELEMENT ThousandSeparator (#PCDATA)>
<!ELEMENT DecimalSeparator (#PCDATA)>
+<!ELEMENT DecimalSeparatorAlternative (#PCDATA)>
<!ELEMENT TimeSeparator (#PCDATA)>
<!ELEMENT Time100SecSeparator (#PCDATA)>
<!ELEMENT ListSeparator (#PCDATA)>
commit f285f3134378cb9a31f02200991e3fc44ca79419
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:22:21 2017 +0200
Parse/gen optional <DecimalSeparatorAlternative> in locale data, tdf#81671
Change-Id: I2781040c76e7c3dbfb4eedc7830a1f24b4c56b46
diff --git a/i18npool/source/localedata/LocaleNode.cxx b/i18npool/source/localedata/LocaleNode.cxx
index 2c0134448343..25b87d8c03a3 100644
--- a/i18npool/source/localedata/LocaleNode.cxx
+++ b/i18npool/source/localedata/LocaleNode.cxx
@@ -227,7 +227,7 @@ OUString LocaleNode::writeParameterCheckLen( const OFileWriter &of,
OUString aVal;
if (pNode)
aVal = pNode->getValue();
- else
+ else if (nMinLen >= 0) // -1: optional => empty, 0: must be present, empty
{
++nError;
fprintf( stderr, "Error: node NULL pointer for parameter %s.\n",
@@ -246,12 +246,15 @@ OUString LocaleNode::writeParameterCheckLen( const OFileWriter &of,
OSTR( aVal));
}
else if (nLen > nMaxLen && nMaxLen >= 0)
+ {
+ ++nError;
fprintf( stderr,
- "Warning: more than %ld character%s (%ld) in %s %s not supported by application.\n",
+ "Error: more than %ld character%s (%ld) in %s '%s' not supported by application.\n",
sal::static_int_cast< long >(nMaxLen), (nMaxLen > 1 ? "s" : ""),
sal::static_int_cast< long >(nLen),
(pNode ? OSTR( pNode->getName()) : ""),
OSTR( aVal));
+ }
return aVal;
}
@@ -262,7 +265,7 @@ OUString LocaleNode::writeParameterCheckLen( const OFileWriter &of,
{
OUString aVal;
const LocaleNode * pNode = findNode( pNodeName);
- if (pNode)
+ if (pNode || nMinLen < 0)
aVal = writeParameterCheckLen( of, pParameterName, pNode, nMinLen, nMaxLen);
else
{
@@ -377,6 +380,8 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const
writeParameterCheckLen( of, "ThousandSeparator", "thousandSeparator", 1, 1);
aDecSep =
writeParameterCheckLen( of, "DecimalSeparator", "decimalSeparator", 1, 1);
+ OUString aDecSepAlt =
+ writeParameterCheckLen( of, "DecimalSeparatorAlternative", "decimalSeparatorAlternative", -1, 1);
OUString aTimeSep =
writeParameterCheckLen( of, "TimeSeparator", "timeSeparator", 1, 1);
OUString aTime100Sep =
@@ -414,13 +419,16 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const
fprintf( stderr, "Warning: %s\n",
"LongDateYearSeparator is empty. Usually this is not the case and may lead to concatenated display names like \"Wednesday, 2007May 9\".");
-
int nSavErr = nError;
int nWarn = 0;
if (aDateSep == aTimeSep)
incError( "DateSeparator equals TimeSeparator.");
if (aDecSep == aThoSep)
incError( "DecimalSeparator equals ThousandSeparator.");
+ if (aDecSepAlt == aThoSep)
+ incError( "DecimalSeparatorAlternative equals ThousandSeparator.");
+ if (aDecSepAlt == aDecSep)
+ incError( "DecimalSeparatorAlternative equals DecimalSeparator, it must not be specified then.");
if ( aThoSep == " " )
incError( "ThousandSeparator is an ' ' ordinary space, this should be a non-breaking space U+00A0 instead.");
if (aListSep == aDecSep)
@@ -572,7 +580,8 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const
of.writeAsciiString("\tLongDateDayOfWeekSeparator,\n");
of.writeAsciiString("\tLongDateDaySeparator,\n");
of.writeAsciiString("\tLongDateMonthSeparator,\n");
- of.writeAsciiString("\tLongDateYearSeparator\n");
+ of.writeAsciiString("\tLongDateYearSeparator,\n");
+ of.writeAsciiString("\tdecimalSeparatorAlternative\n");
of.writeAsciiString("};\n\n");
of.writeFunction("getLocaleItem_", "SAL_N_ELEMENTS(LCType)", "LCType");
}
commit 940808a512ff637f161cc3eb1de0362b2f95318c
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:19:35 2017 +0200
Handle decimalSeparatorAlternative, tdf#81671
Change-Id: I3a3d3b0683ea46cff5c023e911977ce5b2f5f032
diff --git a/vcl/source/control/longcurr.cxx b/vcl/source/control/longcurr.cxx
index 8dd0ec192870..805da72f1eea 100644
--- a/vcl/source/control/longcurr.cxx
+++ b/vcl/source/control/longcurr.cxx
@@ -109,6 +109,7 @@ bool ImplNumericProcessKeyInput( const KeyEvent& rKEvt,
((cChar >= '0') && (cChar <= '9')) ||
(bThousandSep && string::equals(rLocaleDataWrapper.getNumThousandSep(), cChar)) ||
(string::equals(rLocaleDataWrapper.getNumDecimalSep(), cChar) ) ||
+ (string::equals(rLocaleDataWrapper.getNumDecimalSepAlt(), cChar) ) ||
(cChar == '-'));
}
}
@@ -132,6 +133,8 @@ bool ImplNumericGetValue( const OUString& rStr, BigInt& rValue,
// Find decimal sign's position
nDecPos = aStr.indexOf( rLocaleDataWrapper.getNumDecimalSep() );
+ if (nDecPos < 0 && !rLocaleDataWrapper.getNumDecimalSepAlt().isEmpty())
+ nDecPos = aStr.indexOf( rLocaleDataWrapper.getNumDecimalSepAlt() );
if ( nDecPos != -1 )
{
commit 03cf4eaaaf22a70386d4f8557f92dc00e57586c7
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:19:14 2017 +0200
Handle decimalSeparatorAlternative, tdf#81671
Change-Id: Ica696322bfeea641452e73fd49bf89c33b6d4d96
diff --git a/vcl/source/control/field.cxx b/vcl/source/control/field.cxx
index 76786223b122..220da283ba86 100644
--- a/vcl/source/control/field.cxx
+++ b/vcl/source/control/field.cxx
@@ -72,6 +72,7 @@ bool ImplNumericProcessKeyInput( const KeyEvent& rKEvt,
((cChar >= '0') && (cChar <= '9')) ||
string::equals(rLocaleDataWrappper.getNumDecimalSep(), cChar) ||
(bThousandSep && string::equals(rLocaleDataWrappper.getNumThousandSep(), cChar)) ||
+ string::equals(rLocaleDataWrappper.getNumDecimalSepAlt(), cChar) ||
(cChar == '-'));
}
}
@@ -97,6 +98,8 @@ bool ImplNumericGetValue( const OUString& rStr, sal_Int64& rValue,
// find position of decimal point
nDecPos = aStr.indexOf( rLocaleDataWrappper.getNumDecimalSep() );
+ if (nDecPos < 0 && !rLocaleDataWrappper.getNumDecimalSepAlt().isEmpty())
+ nDecPos = aStr.indexOf( rLocaleDataWrappper.getNumDecimalSepAlt() );
// find position of fraction
nFracDivPos = aStr.indexOf( '/' );
commit 7c5b9247c4425f1b733b62e365f15cf390c4bb63
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:18:10 2017 +0200
Handle decimalSeparatorAlternative in TakeRepresentation, tdf#81671
Change-Id: I552cb14fcb048d6c7da9043704c9941686a30993
diff --git a/svx/source/svdraw/svdomeas.cxx b/svx/source/svdraw/svdomeas.cxx
index 5e472c7bc277..81eee47621f7 100644
--- a/svx/source/svdraw/svdomeas.cxx
+++ b/svx/source/svdraw/svdomeas.cxx
@@ -130,9 +130,12 @@ OUString SdrMeasureObj::TakeRepresentation(SdrMeasureFieldKind eMeasureFieldKind
aStr = "?";
}
- sal_Unicode cDec(SvtSysLocale().GetLocaleData().getNumDecimalSep()[0]);
+ SvtSysLocale aSysLocale;
+ const LocaleDataWrapper& rLocaleDataWrapper = aSysLocale.GetLocaleData();
+ sal_Unicode cDec(rLocaleDataWrapper.getNumDecimalSep()[0]);
+ sal_Unicode cDecAlt(rLocaleDataWrapper.getNumDecimalSepAlt().toChar());
- if(aStr.indexOf(cDec) != -1)
+ if(aStr.indexOf(cDec) != -1 || (cDecAlt && aStr.indexOf(cDecAlt) != -1))
{
sal_Int32 nLen2(aStr.getLength() - 1);
@@ -142,7 +145,7 @@ OUString SdrMeasureObj::TakeRepresentation(SdrMeasureFieldKind eMeasureFieldKind
nLen2--;
}
- if(aStr[nLen2] == cDec)
+ if(aStr[nLen2] == cDec || (cDecAlt && aStr[nLen2] == cDecAlt))
{
aStr = aStr.copy(0, nLen2);
nLen2--;
commit 7cf453c78ce67f17661bfc74d1df6073cfc9d2ad
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:16:53 2017 +0200
Use LocaleDataWrapper::stringToDouble() in StrToDouble, tdf#81671
Change-Id: I7c791d8d133b830b146a4a9c6869bf27609167b6
diff --git a/sw/source/core/doc/docsort.cxx b/sw/source/core/doc/docsort.cxx
index c0111810e7c2..26cdcc41a19f 100644
--- a/sw/source/core/doc/docsort.cxx
+++ b/sw/source/core/doc/docsort.cxx
@@ -112,10 +112,7 @@ double SwSortElement::StrToDouble( const OUString& rStr )
rtl_math_ConversionStatus eStatus;
sal_Int32 nEnd;
- double nRet = ::rtl::math::stringToDouble( rStr,
- pLclData->getNumDecimalSep()[0],
- pLclData->getNumThousandSep()[0],
- &eStatus, &nEnd );
+ double nRet = pLclData->stringToDouble( rStr, true, &eStatus, &nEnd );
if( rtl_math_ConversionStatus_Ok != eStatus || nEnd == 0 )
nRet = 0.0;
commit 2c2d57585407acda2ea57c07dab98b5a23b37940
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:15:46 2017 +0200
Use LocaleDataWrapper::stringToDouble() in lcl_Str2Double, tdf#81671
Change-Id: Ife8f955e7f7a1c791c8bd0390981aae5fe9f82dc
diff --git a/sw/source/core/bastyp/calc.cxx b/sw/source/core/bastyp/calc.cxx
index d906f97ca7ca..2e43e93b7947 100644
--- a/sw/source/core/bastyp/calc.cxx
+++ b/sw/source/core/bastyp/calc.cxx
@@ -1324,10 +1324,9 @@ namespace
const sal_Unicode nCurrCmdPos = rCommandPos;
rtl_math_ConversionStatus eStatus;
const sal_Unicode* pEnd;
- rVal = rtl_math_uStringToDouble( rCommand.getStr() + rCommandPos,
+ rVal = pLclData->stringToDouble( rCommand.getStr() + rCommandPos,
rCommand.getStr() + rCommand.getLength(),
- pLclData->getNumDecimalSep()[0],
- pLclData->getNumThousandSep()[0],
+ true,
&eStatus,
&pEnd );
rCommandPos = static_cast<sal_Int32>(pEnd - rCommand.getStr());
commit 29dd087619ee089268fa16771f46f82a1feaa468
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:13:39 2017 +0200
Use LocaleDataWrapper::stringToDouble() in ShadowPropertyPanel, tdf#81671
Change-Id: I3e8f0a4a75c55543a1b6f6e9470cfd7aeb80e603
diff --git a/svx/source/sidebar/shadow/ShadowPropertyPanel.cxx b/svx/source/sidebar/shadow/ShadowPropertyPanel.cxx
index ccad5be1d498..6a94f810056c 100644
--- a/svx/source/sidebar/shadow/ShadowPropertyPanel.cxx
+++ b/svx/source/sidebar/shadow/ShadowPropertyPanel.cxx
@@ -53,10 +53,9 @@ sal_uInt32 ParseText(OUString const & sTmp)
return 0;
const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
- const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
rtl_math_ConversionStatus eStatus;
- double fTmp = rtl::math::stringToDouble( sTmp, cSep, 0, &eStatus);
+ double fTmp = rLocaleWrapper.stringToDouble( sTmp, false, &eStatus, nullptr);
if (eStatus != rtl_math_ConversionStatus_Ok)
return 0;
commit fb5fc8256e79a3185c92c782733a78a18eafabeb
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:12:56 2017 +0200
Use LocaleDataWrapper::stringToDouble() in PosSizePropertyPanel, tdf#81671
Change-Id: Ice64297dff19f653383b1936d7f47c692df0baf8
diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
index 3895b2a41208..64012a7af1cf 100644
--- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
+++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
@@ -430,7 +430,6 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, AngleModifiedHdl, Edit&, void )
return;
const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
- const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
// Do not check that the entire string was parsed up to its end, there may
// be a degree symbol following the number. Note that this also means that
@@ -438,7 +437,7 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, AngleModifiedHdl, Edit&, void )
/* TODO: we could check for the degree symbol stop if there are no other
* cases with different symbol characters in any language? */
rtl_math_ConversionStatus eStatus;
- double fTmp = rtl::math::stringToDouble( sTmp, cSep, 0, &eStatus);
+ double fTmp = rLocaleWrapper.stringToDouble( sTmp, false, &eStatus, nullptr);
if (eStatus != rtl_math_ConversionStatus_Ok)
return;
commit b962def146376dcb48dd93f045fd703489c283e3
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:12:17 2017 +0200
Use LocaleDataWrapper::stringToDouble() in AlignmentPropertyPanel, tdf#81671
Change-Id: I49619f763f3046e94b0bd5d5226e628409310871
diff --git a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
index a00e4bcb06eb..cdb79078bb79 100644
--- a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
+++ b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
@@ -164,7 +164,6 @@ IMPL_LINK_NOARG( AlignmentPropertyPanel, AngleModifiedHdl, Edit&, void )
return;
const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
- const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
// Do not check that the entire string was parsed up to its end, there may
// be a degree symbol following the number. Note that this also means that
@@ -172,7 +171,7 @@ IMPL_LINK_NOARG( AlignmentPropertyPanel, AngleModifiedHdl, Edit&, void )
/* TODO: we could check for the degree symbol stop if there are no other
* cases with different symbol characters in any language? */
rtl_math_ConversionStatus eStatus;
- double fTmp = rtl::math::stringToDouble( sTmp, cSep, 0, &eStatus);
+ double fTmp = rLocaleWrapper.stringToDouble( sTmp, false, &eStatus, nullptr);
if (eStatus != rtl_math_ConversionStatus_Ok)
return;
commit 6c0e05ece7bd6e2ecae63fdb4cd73b1f9eaf7ed4
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:11:25 2017 +0200
Use LocaleDataWrapper::stringToDouble() in ScSolverValueDialog, tdf#81671
Change-Id: I6b29ab335c0d2e66804421cb90a6684b747c5035
diff --git a/sc/source/ui/miscdlgs/solveroptions.cxx b/sc/source/ui/miscdlgs/solveroptions.cxx
index 03bda551f857..59f00ed46851 100644
--- a/sc/source/ui/miscdlgs/solveroptions.cxx
+++ b/sc/source/ui/miscdlgs/solveroptions.cxx
@@ -467,12 +467,10 @@ double ScSolverValueDialog::GetValue() const
{
OUString aInput = m_pEdValue->GetText();
- const LocaleDataWrapper* pLocaleData = ScGlobal::GetpLocaleData();
rtl_math_ConversionStatus eStatus = rtl_math_ConversionStatus_Ok;
- double fValue = rtl::math::stringToDouble( aInput,
- pLocaleData->getNumDecimalSep()[0],
- pLocaleData->getNumThousandSep()[0],
- &eStatus );
+ sal_Int32 nParseEnd = 0;
+ double fValue = ScGlobal::GetpLocaleData()->stringToDouble( aInput, true, &eStatus, &nParseEnd);
+ /* TODO: shouldn't there be some error checking? */
return fValue;
}
commit 9ccdd3f9e1878f31ccd71b099fe926c20e1a92aa
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:10:24 2017 +0200
Use LocaleDataWrapper::stringToDouble() in ScDoubleField::GetValue, tdf#81671
Change-Id: I7ce956a6a08b9b5befd100e2b0030fc2d4787749
diff --git a/sc/source/ui/cctrl/editfield.cxx b/sc/source/ui/cctrl/editfield.cxx
index a516e45c8356..25d3c43888da 100644
--- a/sc/source/ui/cctrl/editfield.cxx
+++ b/sc/source/ui/cctrl/editfield.cxx
@@ -34,11 +34,6 @@ sal_Unicode lclGetDecSep()
return ScGlobal::GetpLocaleData()->getNumDecimalSep()[0];
}
-sal_Unicode lclGetGroupSep()
-{
- return ScGlobal::GetpLocaleData()->getNumThousandSep()[0];
-}
-
} // namespace
ScDoubleField::ScDoubleField( vcl::Window* pParent, WinBits nStyle ) :
@@ -60,7 +55,7 @@ bool ScDoubleField::GetValue( double& rfValue ) const
{
rtl_math_ConversionStatus eStatus;
sal_Int32 nEnd;
- rfValue = rtl::math::stringToDouble( aStr, lclGetDecSep(), lclGetGroupSep(), &eStatus, &nEnd );
+ rfValue = ScGlobal::GetpLocaleData()->stringToDouble( aStr, true, &eStatus, &nEnd );
bOk = (eStatus == rtl_math_ConversionStatus_Ok) && (nEnd == aStr.getLength() );
}
return bOk;
commit 7616e1c18869cda8a924e26337e3f1c83cbb7efe
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 18:00:32 2017 +0200
LocaleDataWrapper::stringToDouble() w/ decimalSeparatorAlternative, tdf#81671
To be used instead of rtl::math::stringToDouble() if locale
dependent separators are involved.
Change-Id: I54359c981901dc57b3d9312b0bfd2f2a14fccb33
diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx
index a5f1988f1db4..02b416250adc 100644
--- a/include/unotools/localedatawrapper.hxx
+++ b/include/unotools/localedatawrapper.hxx
@@ -24,6 +24,7 @@
#include <com/sun/star/i18n/LocaleItem.hpp>
#include <com/sun/star/i18n/reservedWords.hpp>
#include <rtl/ustring.hxx>
+#include <rtl/math.h>
#include <i18nlangtag/languagetag.hxx>
#include <unotools/readwritemutexguard.hxx>
#include <unotools/unotoolsdllapi.h>
@@ -240,6 +241,64 @@ public:
const OUString& getLongDateYearSep() const
{ return getOneLocaleItem( css::i18n::LocaleItem::LONG_DATE_YEAR_SEPARATOR ); }
+ /** A wrapper around rtl::math::stringToDouble() using the locale dependent
+ decimal separator, group separator, and if needed decimal separator
+ alternative.
+
+ The decimal separator is tried first, if the conversion does not match
+ the entire string then the decimal separator alternative is tried if it
+ occurs in the string and was the reason to stop.
+
+ Leading blanks are skipped, trailing blanks are not skipped. The number
+ is parsed up to the first non-floating point number character, same as
+ rtl::math::stringToDouble() does. The caller is responsible for proper
+ error checking and end comparison.
+
+ @param rString
+ The string to parse as floating point number.
+ @param bUseGroupSep
+ Whether group separator is used/accepted during parsing.
+ @param pStatus
+ Pointer to receive the conversion status as in
+ rtl::math::stringToDouble().
+ @param pParseEnd
+ Pointer to receive the parse end (exclusive) as in
+ rtl::math::stringToDouble().
+ @return The floating point number as parsed.
+ */
+ double stringToDouble( const OUString& rString, bool bUseGroupSep,
+ rtl_math_ConversionStatus* pStatus, sal_Int32* pParseEnd ) const;
+
+ /** A wrapper around rtl_math_uStringToDouble() using the locale dependent
+ decimal separator, group separator, and if needed decimal separator
+ alternative.
+
+ The decimal separator is tried first, if the conversion does not match
+ the entire string then the decimal separator alternative is tried if it
+ occurs in the string and was the reason to stop.
+
+ Leading blanks are skipped, trailing blanks are not skipped. The number
+ is parsed up to the first non-floating point number character, same as
+ rtl_math_uStringToDouble() does. The caller is responsible for proper
+ error checking and end comparison.
+
+ @param pBegin
+ The string position to start parsing a floating point number.
+ @param pEnd
+ The string position to stop parsing, exclusive.
+ @param bUseGroupSep
+ Whether group separator is used/accepted during parsing.
+ @param pStatus
+ Pointer to receive the conversion status as in
+ rtl_math_uStringToDouble().
+ @param pParseEnd
+ Pointer to receive the parse end (exclusive) as in
+ rtl_math_uStringToDouble().
+ @return The floating point number as parsed.
+ */
+ double stringToDouble( const sal_Unicode* pBegin, const sal_Unicode* pEnd, bool bUseGroupSep,
+ rtl_math_ConversionStatus* pStatus, const sal_Unicode** ppParseEnd ) const;
+
// currency
const OUString& getCurrSymbol() const;
const OUString& getCurrBankSymbol() const;
diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx
index 52269c291fcc..2f125f6b8e14 100644
--- a/unotools/source/i18n/localedatawrapper.cxx
+++ b/unotools/source/i18n/localedatawrapper.cxx
@@ -41,6 +41,7 @@
#include <rtl/ustrbuf.hxx>
#include <osl/diagnose.h>
#include <sal/macros.h>
+#include <rtl/math.hxx>
static const sal_uInt16 nCurrFormatInvalid = 0xffff;
static const sal_uInt16 nCurrFormatDefault = 0;
@@ -1747,6 +1748,46 @@ OUString LocaleDataWrapper::getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
return aNumber;
}
+// --- number parsing -------------------------------------------------
+
+double LocaleDataWrapper::stringToDouble( const OUString& rString, bool bUseGroupSep,
+ rtl_math_ConversionStatus* pStatus, sal_Int32* pParseEnd ) const
+{
+ const sal_Unicode cGroupSep = (bUseGroupSep ? getNumThousandSep()[0] : 0);
+ rtl_math_ConversionStatus eStatus = rtl_math_ConversionStatus_Ok;
+ sal_Int32 nParseEnd = 0;
+ double fValue = rtl::math::stringToDouble( rString, getNumDecimalSep()[0], cGroupSep, &eStatus, &nParseEnd);
+ bool bTryAlt = (nParseEnd < rString.getLength() && !getNumDecimalSepAlt().isEmpty() &&
+ rString[nParseEnd] == getNumDecimalSepAlt().toChar());
+ // Try re-parsing with alternative if that was the reason to stop.
+ if (bTryAlt)
+ fValue = rtl::math::stringToDouble( rString, getNumDecimalSepAlt().toChar(), cGroupSep, &eStatus, &nParseEnd);
+ if (pStatus)
+ *pStatus = eStatus;
+ if (pParseEnd)
+ *pParseEnd = nParseEnd;
+ return fValue;
+}
+
+double LocaleDataWrapper::stringToDouble( const sal_Unicode* pBegin, const sal_Unicode* pEnd, bool bUseGroupSep,
+ rtl_math_ConversionStatus* pStatus, const sal_Unicode** ppParseEnd ) const
+{
+ const sal_Unicode cGroupSep = (bUseGroupSep ? getNumThousandSep()[0] : 0);
+ rtl_math_ConversionStatus eStatus = rtl_math_ConversionStatus_Ok;
+ const sal_Unicode* pParseEnd = nullptr;
+ double fValue = rtl_math_uStringToDouble( pBegin, pEnd, getNumDecimalSep()[0], cGroupSep, &eStatus, &pParseEnd);
+ bool bTryAlt = (pParseEnd < pEnd && !getNumDecimalSepAlt().isEmpty() &&
+ *pParseEnd == getNumDecimalSepAlt().toChar());
+ // Try re-parsing with alternative if that was the reason to stop.
+ if (bTryAlt)
+ fValue = rtl_math_uStringToDouble( pBegin, pEnd, getNumDecimalSepAlt().toChar(), cGroupSep, &eStatus, &pParseEnd);
+ if (pStatus)
+ *pStatus = eStatus;
+ if (ppParseEnd)
+ *ppParseEnd = pParseEnd;
+ return fValue;
+}
+
// --- mixed ----------------------------------------------------------
LanguageTag LocaleDataWrapper::getLoadedLanguageTag() const
commit dc520c7759fde6e765afece23b78b5ca6dece5b1
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 17:56:19 2017 +0200
Handle decimalSeparatorAlternative in BASIC ImpScan,..., tdf#81671
Change-Id: I73ff2bf624ba7c8d88c9419a109c340806bd31f5
diff --git a/basic/source/sbx/sbxscan.cxx b/basic/source/sbx/sbxscan.cxx
index a0be80e6383a..093595800450 100644
--- a/basic/source/sbx/sbxscan.cxx
+++ b/basic/source/sbx/sbxscan.cxx
@@ -51,12 +51,13 @@
#include <o3tl/make_unique.hxx>
-void ImpGetIntntlSep( sal_Unicode& rcDecimalSep, sal_Unicode& rcThousandSep )
+void ImpGetIntntlSep( sal_Unicode& rcDecimalSep, sal_Unicode& rcThousandSep, sal_Unicode& rcDecimalSepAlt )
{
SvtSysLocale aSysLocale;
const LocaleDataWrapper& rData = aSysLocale.GetLocaleData();
rcDecimalSep = rData.getNumDecimalSep()[0];
rcThousandSep = rData.getNumThousandSep()[0];
+ rcDecimalSepAlt = rData.getNumDecimalSepAlt().toChar();
}
@@ -84,18 +85,22 @@ bool ImpStrChr( const sal_Unicode* p, sal_Unicode c )
ErrCode ImpScan( const OUString& rWSrc, double& nVal, SbxDataType& rType,
sal_uInt16* pLen, bool bAllowIntntl, bool bOnlyIntntl )
{
- sal_Unicode cIntntlDecSep, cIntntlGrpSep;
+ sal_Unicode cIntntlDecSep, cIntntlGrpSep, cIntntlDecSepAlt;
sal_Unicode cNonIntntlDecSep = '.';
if( bAllowIntntl || bOnlyIntntl )
{
- ImpGetIntntlSep( cIntntlDecSep, cIntntlGrpSep );
+ ImpGetIntntlSep( cIntntlDecSep, cIntntlGrpSep, cIntntlDecSepAlt );
if( bOnlyIntntl )
cNonIntntlDecSep = cIntntlDecSep;
+ // Ensure that the decimal separator alternative is really one.
+ if (cIntntlDecSepAlt && cIntntlDecSepAlt == cNonIntntlDecSep)
+ cIntntlDecSepAlt = 0;
}
else
{
cIntntlDecSep = cNonIntntlDecSep;
cIntntlGrpSep = 0; // no group separator accepted in non-i18n
+ cIntntlDecSepAlt = 0;
}
const sal_Unicode* const pStart = rWSrc.getStr();
@@ -113,7 +118,8 @@ ErrCode ImpScan( const OUString& rWSrc, double& nVal, SbxDataType& rType,
bMinus = true;
}
if( rtl::isAsciiDigit( *p ) || ((*p == cNonIntntlDecSep || *p == cIntntlDecSep ||
- (cIntntlDecSep && *p == cIntntlGrpSep)) && rtl::isAsciiDigit( *(p+1) )))
+ (cIntntlDecSep && *p == cIntntlGrpSep) || (cIntntlDecSepAlt && *p == cIntntlDecSepAlt)) &&
+ rtl::isAsciiDigit( *(p+1) )))
{
short exp = 0;
short decsep = 0;
@@ -123,6 +129,8 @@ ErrCode ImpScan( const OUString& rWSrc, double& nVal, SbxDataType& rType,
aSearchStr.append(cNonIntntlDecSep);
if( cIntntlDecSep != cNonIntntlDecSep )
aSearchStr.append(cIntntlDecSep);
+ if( cIntntlDecSepAlt && cIntntlDecSepAlt != cNonIntntlDecSep )
+ aSearchStr.append(cIntntlDecSepAlt);
if( bOnlyIntntl )
aSearchStr.append(cIntntlGrpSep);
const sal_Unicode* const pSearchStr = aSearchStr.getStr();
@@ -135,7 +143,7 @@ ErrCode ImpScan( const OUString& rWSrc, double& nVal, SbxDataType& rType,
p++;
continue;
}
- if( *p == cNonIntntlDecSep || *p == cIntntlDecSep )
+ if( *p == cNonIntntlDecSep || *p == cIntntlDecSep || (cIntntlDecSepAlt && *p == cIntntlDecSepAlt) )
{
// Use the separator that is passed to stringToDouble()
aBuf[ p - pStart ] = cIntntlDecSep;
@@ -318,8 +326,8 @@ static void myftoa( double nNum, char * pBuf, short nPrec, short nExpWidth,
short nDec; // number of positions before decimal point
int i;
- sal_Unicode cDecimalSep, cThousandSep;
- ImpGetIntntlSep( cDecimalSep, cThousandSep );
+ sal_Unicode cDecimalSep, cThousandSep, cDecimalSepAlt;
+ ImpGetIntntlSep( cDecimalSep, cThousandSep, cDecimalSepAlt );
if( cForceThousandSep )
cThousandSep = cForceThousandSep;
@@ -429,8 +437,8 @@ void ImpCvtNum( double nNum, short nPrec, OUString& rRes, bool bCoreString )
char *q;
char cBuf[ 40 ], *p = cBuf;
- sal_Unicode cDecimalSep, cThousandSep;
- ImpGetIntntlSep( cDecimalSep, cThousandSep );
+ sal_Unicode cDecimalSep, cThousandSep, cDecimalSepAlt;
+ ImpGetIntntlSep( cDecimalSep, cThousandSep, cDecimalSepAlt );
if( bCoreString )
cDecimalSep = '.';
@@ -468,13 +476,15 @@ bool ImpConvStringExt( OUString& rSrc, SbxDataType eTargetType )
case SbxDOUBLE:
case SbxCURRENCY:
{
- sal_Unicode cDecimalSep, cThousandSep;
- ImpGetIntntlSep( cDecimalSep, cThousandSep );
+ sal_Unicode cDecimalSep, cThousandSep, cDecimalSepAlt;
+ ImpGetIntntlSep( cDecimalSep, cThousandSep, cDecimalSepAlt );
aNewString = rSrc;
- if( cDecimalSep != '.' )
+ if( cDecimalSep != '.' || (cDecimalSepAlt && cDecimalSepAlt != '.') )
{
sal_Int32 nPos = aNewString.indexOf( cDecimalSep );
+ if( nPos == -1 && cDecimalSepAlt )
+ nPos = aNewString.indexOf( cDecimalSepAlt );
if( nPos != -1 )
{
sal_Unicode* pStr = const_cast<sal_Unicode*>(aNewString.getStr());
commit dcf0877cd04280e598943ecfe299cf7360971056
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 15:35:37 2017 +0200
Handle decimalSeparatorAlternative in SvNumberFormatter parsing, tdf#81671
Change-Id: Ic10aa36805ec4214f7ac54529fb391cf1e390a70
diff --git a/include/svl/zforlist.hxx b/include/svl/zforlist.hxx
index 0d82b6d6d4b4..969d0007380a 100644
--- a/include/svl/zforlist.hxx
+++ b/include/svl/zforlist.hxx
@@ -821,6 +821,7 @@ private:
// cached locale data items needed almost any time
OUString aDecimalSep;
+ OUString aDecimalSepAlt;
OUString aThousandSep;
OUString aDateSep;
@@ -958,11 +959,17 @@ public:
// return the corresponding decimal separator
const OUString& GetNumDecimalSep() const;
+ // return the corresponding decimal separator alternative
+ const OUString& GetNumDecimalSepAlt() const;
+
// return the corresponding group (AKA thousand) separator
const OUString& GetNumThousandSep() const;
// return the corresponding date separator
const OUString& GetDateSep() const;
+
+ // checks for decimal separator and optional alternative
+ bool IsDecimalSep( const OUString& rStr ) const;
};
#endif // INCLUDED_SVL_ZFORLIST_HXX
diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx
index 83c37af79c2e..5f717108f263 100644
--- a/svl/source/numbers/zforfind.cxx
+++ b/svl/source/numbers/zforfind.cxx
@@ -794,6 +794,12 @@ inline bool ImpSvNumberInputScan::GetDecSep( const OUString& rString, sal_Int32&
nPos = nPos + rSep.getLength();
return true;
}
+ const OUString& rSepAlt = pFormatter->GetNumDecimalSepAlt();
+ if ( !rSepAlt.isEmpty() && rString.match( rSepAlt, nPos) )
+ {
+ nPos = nPos + rSepAlt.getLength();
+ return true;
+ }
}
return false;
}
@@ -3121,7 +3127,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, /
if (eSetType == css::util::NumberFormat::FRACTION) // Fraction 1 = 1/1
{
if (i >= nStringsCnt || // no end string nor decimal separator
- sStrArray[i] == pFormatter->GetNumDecimalSep())
+ pFormatter->IsDecimalSep( sStrArray[i]))
{
eScannedType = css::util::NumberFormat::FRACTION;
nMatchedAllStrings &= ~nMatchedVirgin;
@@ -3144,7 +3150,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, /
eScannedType == css::util::NumberFormat::UNDEFINED && // not date or currency
nDecPos == 0 && // no previous decimal separator
(i >= nStringsCnt || // no end string nor decimal separator
- sStrArray[i] == pFormatter->GetNumDecimalSep())
+ pFormatter->IsDecimalSep( sStrArray[i]))
)
{
eScannedType = css::util::NumberFormat::FRACTION;
@@ -3490,6 +3496,11 @@ void ImpSvNumberInputScan::ChangeIntl()
sal_Unicode cDecSep = pFormatter->GetNumDecimalSep()[0];
bDecSepInDateSeps = ( cDecSep == '-' ||
cDecSep == pFormatter->GetDateSep()[0] );
+ if (!bDecSepInDateSeps)
+ {
+ sal_Unicode cDecSepAlt = pFormatter->GetNumDecimalSepAlt().toChar();
+ bDecSepInDateSeps = cDecSepAlt && (cDecSepAlt == '-' || cDecSepAlt == pFormatter->GetDateSep()[0]);
+ }
bTextInitialized = false;
aUpperCurrSymbol.clear();
InvalidateDateAcceptancePatterns();
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 94912797057c..f4c236827a01 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -307,6 +307,7 @@ void SvNumberFormatter::ImpConstruct( LanguageType eLang )
// cached locale data items
const LocaleDataWrapper* pLoc = GetLocaleData();
aDecimalSep = pLoc->getNumDecimalSep();
+ aDecimalSepAlt = pLoc->getNumDecimalSepAlt();
aThousandSep = pLoc->getNumThousandSep();
aDateSep = pLoc->getDateSep();
@@ -338,6 +339,7 @@ void SvNumberFormatter::ChangeIntl(LanguageType eLnge)
// cached locale data items, initialize BEFORE calling ChangeIntl below
const LocaleDataWrapper* pLoc = GetLocaleData();
aDecimalSep = pLoc->getNumDecimalSep();
+ aDecimalSepAlt = pLoc->getNumDecimalSepAlt();
aThousandSep = pLoc->getNumThousandSep();
aDateSep = pLoc->getDateSep();
@@ -537,10 +539,21 @@ const NativeNumberWrapper* SvNumberFormatter::GetNatNum() const { return xNatNum
const OUString& SvNumberFormatter::GetNumDecimalSep() const { return aDecimalSep; }
+const OUString& SvNumberFormatter::GetNumDecimalSepAlt() const { return aDecimalSepAlt; }
+
const OUString& SvNumberFormatter::GetNumThousandSep() const { return aThousandSep; }
const OUString& SvNumberFormatter::GetDateSep() const { return aDateSep; }
+bool SvNumberFormatter::IsDecimalSep( const OUString& rStr ) const
+{
+ if (rStr == GetNumDecimalSep())
+ return true;
+ if (GetNumDecimalSepAlt().isEmpty())
+ return false;
+ return rStr == GetNumDecimalSepAlt();
+}
+
bool SvNumberFormatter::IsTextFormat(sal_uInt32 F_Index) const
{
const SvNumberformat* pFormat = GetFormatEntry(F_Index);
commit 5ab5243068ff0e023da35633922f140688c7fcbd
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 15:31:29 2017 +0200
Check decimalSeparatorAlternative in CheckConfigOptions(), tdf#81671
Change-Id: I5281a6e63e1cff8ae47f1b79eb4fdb5e7eaa074b
diff --git a/sc/source/ui/docshell/docsh6.cxx b/sc/source/ui/docshell/docsh6.cxx
index 9ec7631aa749..6b611373cd05 100644
--- a/sc/source/ui/docshell/docsh6.cxx
+++ b/sc/source/ui/docshell/docsh6.cxx
@@ -476,6 +476,7 @@ void ScDocShell::CheckConfigOptions()
return;
OUString aDecSep = ScGlobal::GetpLocaleData()->getNumDecimalSep();
+ OUString aDecSepAlt = ScGlobal::GetpLocaleData()->getNumDecimalSepAlt();
ScModule* pScMod = SC_MOD();
const ScFormulaOptions& rOpt=pScMod->GetFormulaOptions();
@@ -483,7 +484,8 @@ void ScDocShell::CheckConfigOptions()
const OUString& aSepArrRow = rOpt.GetFormulaSepArrayRow();
const OUString& aSepArrCol = rOpt.GetFormulaSepArrayCol();
- if (aDecSep == aSepArg || aDecSep == aSepArrRow || aDecSep == aSepArrCol)
+ if (aDecSep == aSepArg || aDecSep == aSepArrRow || aDecSep == aSepArrCol ||
+ aDecSepAlt == aSepArg || aDecSepAlt == aSepArrRow || aDecSepAlt == aSepArrCol)
{
// One of arg separators conflicts with the current decimal
// separator. Reset them to default.
commit 0ce0999fa2ace834558f9e79053df60b60623950
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 15:28:52 2017 +0200
Check decimalSeparatorAlternative in GetDefaultFormulaSeparators(), tdf#81671
Change-Id: Idf413d1e9db4f63bd90888f1dfc6a5d9455e47cb
diff --git a/sc/source/core/tool/formulaopt.cxx b/sc/source/core/tool/formulaopt.cxx
index 2271d8801164..5fba1d82661b 100644
--- a/sc/source/core/tool/formulaopt.cxx
+++ b/sc/source/core/tool/formulaopt.cxx
@@ -88,13 +88,19 @@ void ScFormulaOptions::GetDefaultFormulaSeparators(
sal_Unicode cDecSep = rDecSep[0];
sal_Unicode cListSep = rListSep[0];
+ sal_Unicode cDecSepAlt = rLocaleData.getNumDecimalSepAlt().toChar(); // usually 0 (empty)
// Excel by default uses system's list separator as the parameter
// separator, which in English locales is a comma. However, OOo's list
// separator value is set to ';' for all English locales. Because of this
// discrepancy, we will hardcode the separator value here, for now.
- if (cDecSep == '.')
+ // Similar for decimal separator alternative.
+ // However, if the decimal separator alternative is '.' and the decimal
+ // separator is ',' this makes no sense, fall back to ';' in that case.
+ if (cDecSep == '.' || (cDecSepAlt == '.' && cDecSep != ','))
cListSep = ',';
+ else if (cDecSep == ',' && cDecSepAlt == '.')
+ cListSep = ';';
// Special case for de_CH locale.
if (rLocale.Language == "de" && rLocale.Country == "CH")
commit ca214981553eb21a4276d07c76db0c37c234a11c
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 15:27:07 2017 +0200
Handle decimalSeparatorAlternative in ScColumn::ParseString(), tdf#81671
Change-Id: I9f708b28ee5fdb23217e75386a64ab86dacfd3c4
diff --git a/sc/inc/stringutil.hxx b/sc/inc/stringutil.hxx
index bf4c519ab014..b28867f7f361 100644
--- a/sc/inc/stringutil.hxx
+++ b/sc/inc/stringutil.hxx
@@ -122,12 +122,13 @@ public:
* @param rStr string to parse
* @param dsep decimal separator
* @param gsep group separator (aka thousands separator)
+ * @param dsepa decimal separator alternative, usually 0
* @param rVal value of successfully parsed number
*
* @return true if the string is a valid number, false otherwise.
*/
static bool parseSimpleNumber(
- const OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, double& rVal);
+ const OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, sal_Unicode dsepa, double& rVal);
static bool parseSimpleNumber(
const char* p, size_t n, char dsep, char gsep, double& rVal);
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index db7bb49bff27..f03bb90fd470 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -1641,6 +1641,7 @@ void Test::testCSV()
bool bResult = ScStringUtil::parseSimpleNumber
(aStr, aTests[i].eSep == English ? '.' : ',',
aTests[i].eSep == English ? ',' : '.',
+ 0,
nValue);
CPPUNIT_ASSERT_EQUAL_MESSAGE ("CSV numeric detection failure", aTests[i].bResult, bResult);
CPPUNIT_ASSERT_EQUAL_MESSAGE ("CSV numeric value failure", aTests[i].nValue, nValue);
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 001d8d320485..646210a8e679 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -1806,13 +1806,15 @@ bool ScColumn::ParseString(
const LocaleDataItem2& aLocaleItem = pLocale->getLocaleItem();
const OUString& rDecSep = aLocaleItem.decimalSeparator;
const OUString& rGroupSep = aLocaleItem.thousandSeparator;
- if (rDecSep.getLength() != 1 || rGroupSep.getLength() != 1)
+ const OUString& rDecSepAlt = aLocaleItem.decimalSeparatorAlternative;
+ if (rDecSep.getLength() != 1 || rGroupSep.getLength() != 1 || rDecSepAlt.getLength() > 1)
break;
sal_Unicode dsep = rDecSep[0];
sal_Unicode gsep = rGroupSep[0];
+ sal_Unicode dsepa = rDecSepAlt.toChar();
- if (!ScStringUtil::parseSimpleNumber(rString, dsep, gsep, nVal))
+ if (!ScStringUtil::parseSimpleNumber(rString, dsep, gsep, dsepa, nVal))
break;
rCell.set(nVal);
diff --git a/sc/source/core/tool/stringutil.cxx b/sc/source/core/tool/stringutil.cxx
index 94f49e0fef70..8ac5a3a6a0d0 100644
--- a/sc/source/core/tool/stringutil.cxx
+++ b/sc/source/core/tool/stringutil.cxx
@@ -49,7 +49,7 @@ void ScSetStringParam::setNumericInput()
}
bool ScStringUtil::parseSimpleNumber(
- const OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, double& rVal)
+ const OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, sal_Unicode dsepa, double& rVal)
{
// Actually almost the entire pre-check is unnecessary and we could call
// rtl::math::stringToDouble() just after having exchanged ascii space with
@@ -110,7 +110,7 @@ bool ScStringUtil::parseSimpleNumber(
haveSeenDigit = true;
++nDigitCount;
}
- else if (c == dsep)
+ else if (c == dsep || (dsepa && c == dsepa))
{
// this is a decimal separator.
@@ -125,7 +125,7 @@ bool ScStringUtil::parseSimpleNumber(
nPosDSep = i;
nPosGSep = -1;
- aBuf.append(c);
+ aBuf.append(dsep); // append the separator that is parsed in stringToDouble() below
nDigitCount = 0;
}
else if (c == gsep)
commit c1a47f1a51360f4afed094c1f87790fafb95e103
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 15:12:58 2017 +0200
Handle decimalSeparatorAlternative in ScCompiler, tdf#81671
Change-Id: I7471f0fb237e29a6f4e8bdd3405cd3b831673ca6
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index cd8760b6bde6..3844e80008e0 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -2018,8 +2018,8 @@ sal_Int32 ScCompiler::NextSymbol(bool bInArray)
sal_Unicode cSep = mxSymbols->getSymbolChar( ocSep);
sal_Unicode cArrayColSep = mxSymbols->getSymbolChar( ocArrayColSep);
sal_Unicode cArrayRowSep = mxSymbols->getSymbolChar( ocArrayRowSep);
- sal_Unicode cDecSep = (mxSymbols->isEnglish() ? '.' :
- ScGlobal::pLocaleData->getNumDecimalSep()[0]);
+ sal_Unicode cDecSep = (mxSymbols->isEnglish() ? '.' : ScGlobal::pLocaleData->getNumDecimalSep()[0]);
+ sal_Unicode cDecSepAlt = (mxSymbols->isEnglish() ? 0 : ScGlobal::pLocaleData->getNumDecimalSepAlt().toChar());
// special symbols specific to address convention used
sal_Unicode cSheetPrefix = pConv->getSpecialSymbol(ScCompiler::Convention::ABS_SHEET_PREFIX);
@@ -2262,7 +2262,7 @@ Label_MaskStateMachine:
SetError(FormulaError::StringOverflow);
eState = ssStop;
}
- else if (c == cDecSep)
+ else if (c == cDecSep || (cDecSepAlt && c == cDecSepAlt))
{
if (++nDecSeps > 1)
{
@@ -3202,10 +3202,17 @@ bool ScCompiler::IsReference( const OUString& rName, const OUString* pErrRef )
{
// Has to be called before IsValue
sal_Unicode ch1 = rName[0];
- sal_Unicode cDecSep = ( mxSymbols->isEnglish() ? '.' :
- ScGlobal::pLocaleData->getNumDecimalSep()[0] );
+ sal_Unicode cDecSep = ( mxSymbols->isEnglish() ? '.' : ScGlobal::pLocaleData->getNumDecimalSep()[0] );
if ( ch1 == cDecSep )
return false;
+ // Code further down checks only if cDecSep=='.' so simply obtaining the
+ // alternative decimal separator if it's not is sufficient.
+ if (cDecSep != '.')
+ {
+ cDecSep = ScGlobal::pLocaleData->getNumDecimalSepAlt().toChar();
+ if ( ch1 == cDecSep )
+ return false;
+ }
// Who was that imbecile introducing '.' as the sheet name separator!?!
if ( rtl::isAsciiDigit( ch1 ) && pConv->getSpecialSymbol( Convention::SHEET_SEPARATOR) == '.' )
{
commit 21052ba2edeef9e16bf90fea62f007b1131c73c0
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 15:07:00 2017 +0200
Allow decimalSeparatorAlternative in cclass_unicode::parseText(), tdf#81671
Change-Id: I0469027951e68d3c08f40c236db3865edbdaa3e0
diff --git a/i18npool/inc/cclass_unicode.hxx b/i18npool/inc/cclass_unicode.hxx
index d276347fa78c..b3390de4b6f1 100644
--- a/i18npool/inc/cclass_unicode.hxx
+++ b/i18npool/inc/cclass_unicode.hxx
@@ -138,6 +138,7 @@ private:
ScanState eState;
sal_Unicode cGroupSep;
sal_Unicode cDecimalSep;
+ sal_Unicode cDecimalSepAlt;
/// Get corresponding KParseTokens flag for a character
static sal_Int32 getParseTokensType(sal_uInt32 c, bool isFirst);
diff --git a/i18npool/source/characterclassification/cclass_unicode_parser.cxx b/i18npool/source/characterclassification/cclass_unicode_parser.cxx
index 6e7279c229dc..1979135b8eca 100644
--- a/i18npool/source/characterclassification/cclass_unicode_parser.cxx
+++ b/i18npool/source/characterclassification/cclass_unicode_parser.cxx
@@ -433,18 +433,21 @@ void cclass_Unicode::initParserTable( const Locale& rLocale, sal_Int32 startChar
// specials
if( mxLocaleData.is() )
{
- LocaleDataItem aItem =
- mxLocaleData->getLocaleItem( aParserLocale );
+ LocaleDataItem2 aItem =
+ mxLocaleData->getLocaleItem2( aParserLocale );
//!TODO: theoretically separators may be a string, adjustment would have to be
//! done here and in parsing and in ::rtl::math::stringToDouble()
cGroupSep = aItem.thousandSeparator[0];
cDecimalSep = aItem.decimalSeparator[0];
+ cDecimalSepAlt = aItem.decimalSeparatorAlternative.toChar();
}
if ( cGroupSep < nDefCnt )
pTable[cGroupSep] |= ParserFlags::VALUE;
if ( cDecimalSep < nDefCnt )
pTable[cDecimalSep] |= ParserFlags::CHAR_VALUE | ParserFlags::VALUE;
+ if ( cDecimalSepAlt && cDecimalSepAlt < nDefCnt )
+ pTable[cDecimalSepAlt] |= ParserFlags::CHAR_VALUE | ParserFlags::VALUE;
// Modify characters according to KParseTokens definitions.
{
@@ -593,6 +596,8 @@ ParserFlags cclass_Unicode::getFlagsExtended(sal_uInt32 const c)
return ParserFlags::VALUE;
else if ( c == cDecimalSep )
return ParserFlags::CHAR_VALUE | ParserFlags::VALUE;
+ else if ( cDecimalSepAlt && c == cDecimalSepAlt )
+ return ParserFlags::CHAR_VALUE | ParserFlags::VALUE;
bool bStart = (eState == ssGetChar || eState == ssGetWordFirstChar ||
eState == ssRewindFromValue || eState == ssIgnoreLeadingInRewind);
sal_Int32 nTypes = (bStart ? nStartTypes : nContTypes);
@@ -704,6 +709,7 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32
bool bQuote = false;
bool bMightBeWord = true;
bool bMightBeWordLast = true;
+ bool bDecSepAltUsed = false;
//! All the variables above (plus ParseResult) have to be resetted on ssRewindFromValue!
sal_Int32 nextCharIndex(nPos); // == index of nextChar
@@ -743,7 +749,7 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32
else
r.TokenType = KParseType::ASC_NUMBER;
}
- else if (current == cDecimalSep)
+ else if (current == cDecimalSep || (bDecSepAltUsed = (cDecimalSepAlt && current == cDecimalSep)))
{
if (nextChar)
++nDecSeps;
@@ -812,7 +818,8 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32
}
if ( nMask & ParserFlags::VALUE )
{
- if (current == cDecimalSep && ++nDecSeps > 1)
+ if ((current == cDecimalSep || (bDecSepAltUsed = (cDecimalSepAlt && current == cDecimalSepAlt))) &&
+ ++nDecSeps > 1)
{
if (nCodePoints == 2)
eState = ssRewindFromValue;
@@ -954,6 +961,7 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32
bQuote = false;
bMightBeWord = true;
bMightBeWordLast = true;
+ bDecSepAltUsed = false;
}
else
{
@@ -1001,7 +1009,7 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32
if ( r.TokenType & KParseType::ASC_NUMBER )
{
r.Value = rtl_math_uStringToDouble(rText.getStr() + nPos + r.LeadingWhiteSpace,
- rText.getStr() + r.EndPos, cDecimalSep, cGroupSep, nullptr, nullptr);
+ rText.getStr() + r.EndPos, (bDecSepAltUsed ? cDecimalSepAlt : cDecimalSep), cGroupSep, nullptr, nullptr);
if ( bMightBeWord )
r.TokenType |= KParseType::IDENTNAME;
}
commit 922a94f376d90c72315f86f2604924c142fca5be
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 14:52:43 2017 +0200
Add LocaleDataWrapper::getNumDecimalSepAlt(), tdf#81671
Change-Id: Id3a16004603685ef859506c2c6d86f8ff097c1d0
diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx
index 398c990fe53b..a5f1988f1db4 100644
--- a/include/unotools/localedatawrapper.hxx
+++ b/include/unotools/localedatawrapper.hxx
@@ -65,7 +65,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
css::uno::Sequence< OUString > aDateAcceptancePatterns;
css::uno::Sequence< sal_Int32 > aGrouping;
// cached items
- OUString aLocaleItem[css::i18n::LocaleItem::COUNT];
+ OUString aLocaleItem[css::i18n::LocaleItem::COUNT2];
OUString aReservedWord[css::i18n::reservedWords::COUNT];
OUString aCurrSymbol;
OUString aCurrBankSymbol;
@@ -209,6 +209,8 @@ public:
{ return getOneLocaleItem( css::i18n::LocaleItem::THOUSAND_SEPARATOR ); }
const OUString& getNumDecimalSep() const
{ return getOneLocaleItem( css::i18n::LocaleItem::DECIMAL_SEPARATOR ); }
+ const OUString& getNumDecimalSepAlt() const
+ { return getOneLocaleItem( css::i18n::LocaleItem::DECIMAL_SEPARATOR_ALTERNATIVE ); }
const OUString& getTimeSep() const
{ return getOneLocaleItem( css::i18n::LocaleItem::TIME_SEPARATOR ); }
const OUString& getTime100SecSep() const
diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx
index d2552ffe4a82..52269c291fcc 100644
--- a/unotools/source/i18n/localedatawrapper.cxx
+++ b/unotools/source/i18n/localedatawrapper.cxx
@@ -355,7 +355,7 @@ std::vector< LanguageType > LocaleDataWrapper::getInstalledLanguageTypes()
const OUString& LocaleDataWrapper::getOneLocaleItem( sal_Int16 nItem ) const
{
::utl::ReadWriteGuard aGuard( aMutex );
- if ( nItem >= LocaleItem::COUNT )
+ if ( nItem >= LocaleItem::COUNT2 )
{
SAL_WARN( "unotools.i18n", "getOneLocaleItem: bounds" );
return aLocaleItem[0];
@@ -428,6 +428,9 @@ void LocaleDataWrapper::getOneLocaleItemImpl( sal_Int16 nItem )
case LocaleItem::LONG_DATE_YEAR_SEPARATOR :
aLocaleItem[nItem] = aLocaleDataItem.LongDateYearSeparator;
break;
+ case LocaleItem::DECIMAL_SEPARATOR_ALTERNATIVE :
+ aLocaleItem[nItem] = aLocaleDataItem.decimalSeparatorAlternative;
+ break;
default:
SAL_WARN( "unotools.i18n", "getOneLocaleItemImpl: which one?" );
}
commit 51a7ae749de90485f3b15a3f935f0f11d5aeff5b
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 14:48:26 2017 +0200
Let LocaleDataWrapper::getLocaleItem() return LocaleDataItem2&, tdf#81671
Change-Id: I16cfe81dd3ce0c8c2e905d55bea13df134c7a398
diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx
index be53b7558add..398c990fe53b 100644
--- a/include/unotools/localedatawrapper.hxx
+++ b/include/unotools/localedatawrapper.hxx
@@ -60,7 +60,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
LanguageTag maLanguageTag;
std::shared_ptr< css::i18n::Calendar2 > xDefaultCalendar;
std::shared_ptr< css::i18n::Calendar2 > xSecondaryCalendar;
- css::i18n::LocaleDataItem aLocaleDataItem;
+ css::i18n::LocaleDataItem2 aLocaleDataItem;
css::uno::Sequence< OUString > aReservedWordSeq;
css::uno::Sequence< OUString > aDateAcceptancePatterns;
css::uno::Sequence< sal_Int32 > aGrouping;
@@ -82,7 +82,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
{
bool operator()(const css::lang::Locale& rLocale1, const css::lang::Locale& rLocale2) const;
};
- mutable std::map<css::lang::Locale, css::i18n::LocaleDataItem, Locale_Compare> maDataItemCache;
+ mutable std::map<css::lang::Locale, css::i18n::LocaleDataItem2, Locale_Compare> maDataItemCache;
// whenever Locale changes
void invalidateData();
@@ -144,7 +144,8 @@ public:
// Wrapper implementations of service LocaleData
css::i18n::LanguageCountryInfo getLanguageCountryInfo() const;
- const css::i18n::LocaleDataItem& getLocaleItem() const;
+ /// NOTE: this wraps XLocaleData5::getLocaleItem2() in fact.
+ const css::i18n::LocaleDataItem2& getLocaleItem() const;
/// NOTE: this wraps XLocaleData3::getAllCalendars2() in fact.
css::uno::Sequence< css::i18n::Calendar2 > getAllCalendars() const;
/// NOTE: this wraps XLocaleData2::getAllCurrencies2() in fact.
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 847e6f84d355..001d8d320485 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -49,7 +49,7 @@
#include <listenercontext.hxx>
#include <filterentries.hxx>
-#include <com/sun/star/i18n/LocaleDataItem.hpp>
+#include <com/sun/star/i18n/LocaleDataItem2.hpp>
#include <memory>
@@ -64,7 +64,7 @@
#include <cstdio>
-using ::com::sun::star::i18n::LocaleDataItem;
+using ::com::sun::star::i18n::LocaleDataItem2;
using namespace formula;
@@ -1803,7 +1803,7 @@ bool ScColumn::ParseString(
if (!pLocale)
break;
- const LocaleDataItem& aLocaleItem = pLocale->getLocaleItem();
+ const LocaleDataItem2& aLocaleItem = pLocale->getLocaleItem();
const OUString& rDecSep = aLocaleItem.decimalSeparator;
const OUString& rGroupSep = aLocaleItem.thousandSeparator;
if (rDecSep.getLength() != 1 || rGroupSep.getLength() != 1)
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 6347e24086ef..fba985e7d28d 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -99,7 +99,7 @@ using namespace ::com::sun::star::i18n;
bool SplitString( const OUString &sWhole,
OUString &sPrefix, OUString &sSuffix, double &fNum )
{
- i18n::LocaleDataItem aLocaleItem = ScGlobal::pLocaleData->getLocaleItem();
+ i18n::LocaleDataItem2 aLocaleItem = ScGlobal::pLocaleData->getLocaleItem();
// Get prefix element
OUString sUser = "-";
diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx
index 77940997ace6..d2552ffe4a82 100644
--- a/unotools/source/i18n/localedatawrapper.cxx
+++ b/unotools/source/i18n/localedatawrapper.cxx
@@ -173,7 +173,7 @@ css::i18n::LanguageCountryInfo LocaleDataWrapper::getLanguageCountryInfo() const
return css::i18n::LanguageCountryInfo();
}
-const css::i18n::LocaleDataItem& LocaleDataWrapper::getLocaleItem() const
+const css::i18n::LocaleDataItem2& LocaleDataWrapper::getLocaleItem() const
{
{
::utl::ReadWriteGuard aGuard( aMutex );
@@ -188,7 +188,7 @@ const css::i18n::LocaleDataItem& LocaleDataWrapper::getLocaleItem() const
::utl::ReadWriteGuard aGuard( aMutex );
const css::lang::Locale& rLocal = getMyLocale();
- css::i18n::LocaleDataItem aItem = xLD->getLocaleItem( rLocal );
+ css::i18n::LocaleDataItem2 aItem = xLD->getLocaleItem2( rLocal );
auto aRet = maDataItemCache.insert(std::make_pair(rLocal, aItem));
assert(aRet.second);
return aRet.first->second;
@@ -197,7 +197,7 @@ const css::i18n::LocaleDataItem& LocaleDataWrapper::getLocaleItem() const
{
SAL_WARN( "unotools.i18n", "getLocaleItem: Exception caught " << e );
}
- static css::i18n::LocaleDataItem aEmptyItem;
+ static css::i18n::LocaleDataItem2 aEmptyItem;
return aEmptyItem;
}
commit 2c1ab132685bee9251901be38e113e129c2c3fce
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 13:10:11 2017 +0200
Instanciate XLocaleData5 in all internal interfaces, tdf#81671
Change-Id: I71ab5008be930efdd3ba944b020554b9d65ed729
diff --git a/i18npool/inc/cclass_unicode.hxx b/i18npool/inc/cclass_unicode.hxx
index 8e2fe1c445c8..d276347fa78c 100644
--- a/i18npool/inc/cclass_unicode.hxx
+++ b/i18npool/inc/cclass_unicode.hxx
@@ -21,7 +21,7 @@
#include <com/sun/star/i18n/XNativeNumberSupplier.hpp>
#include <com/sun/star/i18n/XCharacterClassification.hpp>
-#include <com/sun/star/i18n/XLocaleData4.hpp>
+#include <com/sun/star/i18n/XLocaleData5.hpp>
#include <cppuhelper/implbase.hxx>
#include <com/sun/star/lang/XServiceInfo.hpp>
@@ -126,7 +126,7 @@ private:
/// used for parser only
css::lang::Locale aParserLocale;
- css::uno::Reference < css::i18n::XLocaleData4 > mxLocaleData;
+ css::uno::Reference < css::i18n::XLocaleData5 > mxLocaleData;
css::uno::Reference < css::i18n::XNativeNumberSupplier > xNatNumSup;
OUString aStartChars;
OUString aContChars;
diff --git a/i18npool/inc/collatorImpl.hxx b/i18npool/inc/collatorImpl.hxx
index b6f9dd25f791..47641a25f3a5 100644
--- a/i18npool/inc/collatorImpl.hxx
+++ b/i18npool/inc/collatorImpl.hxx
@@ -21,7 +21,7 @@
#include <comphelper/processfactory.hxx>
#include <com/sun/star/uno/Reference.h>
-#include <com/sun/star/i18n/XLocaleData4.hpp>
+#include <com/sun/star/i18n/XLocaleData5.hpp>
#include <com/sun/star/i18n/XCollator.hpp>
#include <com/sun/star/lang/Locale.hpp>
#include <cppuhelper/weak.hxx>
@@ -94,7 +94,7 @@ private:
// Service Factory
css::uno::Reference < css::uno::XComponentContext > m_xContext;
// lang::Locale Data
- css::uno::Reference < css::i18n::XLocaleData4 > mxLocaleData;
+ css::uno::Reference < css::i18n::XLocaleData5 > mxLocaleData;
/// @throws css::uno::RuntimeException
bool SAL_CALL createCollator(const css::lang::Locale& rLocale, const OUString& serviceName,
diff --git a/i18npool/inc/numberformatcode.hxx b/i18npool/inc/numberformatcode.hxx
index d74231fc1560..a9c4a67c8b51 100644
--- a/i18npool/inc/numberformatcode.hxx
+++ b/i18npool/inc/numberformatcode.hxx
@@ -25,7 +25,7 @@
#include <cppuhelper/implbase.hxx>
#include <com/sun/star/i18n/XNumberFormatCode.hpp>
-#include <com/sun/star/i18n/XLocaleData4.hpp>
+#include <com/sun/star/i18n/XLocaleData5.hpp>
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/lang/XServiceInfo.hpp>
@@ -55,7 +55,7 @@ public:
private:
osl::Mutex maMutex;
- css::uno::Reference < css::i18n::XLocaleData4 > m_xLocaleData;
+ css::uno::Reference < css::i18n::XLocaleData5 > m_xLocaleData;
typedef std::pair< css::lang::Locale, css::uno::Sequence< css::i18n::FormatElement > > FormatElementCacheItem;
std::deque < FormatElementCacheItem > m_aFormatElementCache;
diff --git a/i18npool/inc/transliterationImpl.hxx b/i18npool/inc/transliterationImpl.hxx
index c5e83b254885..0d70de37bfd2 100644
--- a/i18npool/inc/transliterationImpl.hxx
+++ b/i18npool/inc/transliterationImpl.hxx
@@ -19,7 +19,7 @@
#ifndef INCLUDED_I18NPOOL_INC_TRANSLITERATIONIMPL_HXX
#define INCLUDED_I18NPOOL_INC_TRANSLITERATIONIMPL_HXX
-#include <com/sun/star/i18n/XLocaleData4.hpp>
+#include <com/sun/star/i18n/XLocaleData5.hpp>
#include <com/sun/star/i18n/XExtendedTransliteration.hpp>
#include <cppuhelper/implbase.hxx>
#include <com/sun/star/uno/XComponentContext.hpp>
@@ -87,7 +87,7 @@ private:
sal_Int16 numCascade;
bool caseignoreOnly;
css::uno::Reference< css::uno::XComponentContext > mxContext;
- css::uno::Reference< css::i18n::XLocaleData4 > mxLocaledata;
+ css::uno::Reference< css::i18n::XLocaleData5 > mxLocaledata;
css::uno::Reference< css::i18n::XExtendedTransliteration > caseignore;
/// @throws css::uno::RuntimeException
diff --git a/i18npool/source/characterclassification/cclass_unicode_parser.cxx b/i18npool/source/characterclassification/cclass_unicode_parser.cxx
index dc3d0775586d..6e7279c229dc 100644
--- a/i18npool/source/characterclassification/cclass_unicode_parser.cxx
+++ b/i18npool/source/characterclassification/cclass_unicode_parser.cxx
@@ -25,7 +25,7 @@
#include <com/sun/star/i18n/KParseTokens.hpp>
#include <com/sun/star/i18n/KParseType.hpp>
#include <com/sun/star/i18n/UnicodeType.hpp>
-#include <com/sun/star/i18n/LocaleData.hpp>
+#include <com/sun/star/i18n/LocaleData2.hpp>
#include <com/sun/star/i18n/NativeNumberMode.hpp>
#include <com/sun/star/i18n/NativeNumberSupplier.hpp>
#include <comphelper/processfactory.hxx>
@@ -381,7 +381,7 @@ bool cclass_Unicode::setupInternational( const Locale& rLocale )
}
if ( !mxLocaleData.is() )
{
- mxLocaleData.set( LocaleData::create(m_xContext) );
+ mxLocaleData.set( LocaleData2::create(m_xContext) );
}
return bChanged;
}
diff --git a/i18npool/source/collator/collatorImpl.cxx b/i18npool/source/collator/collatorImpl.cxx
index 258ee9f6ec66..fd9b1f1bb053 100644
--- a/i18npool/source/collator/collatorImpl.cxx
+++ b/i18npool/source/collator/collatorImpl.cxx
@@ -20,7 +20,7 @@
#include <collatorImpl.hxx>
#include <localedata.hxx>
#include <com/sun/star/i18n/CollatorOptions.hpp>
-#include <com/sun/star/i18n/LocaleData.hpp>
+#include <com/sun/star/i18n/LocaleData2.hpp>
#include <rtl/ustrbuf.hxx>
#include <comphelper/processfactory.hxx>
#include <cppuhelper/supportsservice.hxx>
@@ -34,7 +34,7 @@ namespace i18npool {
CollatorImpl::CollatorImpl( const Reference < XComponentContext >& rxContext ) : m_xContext(rxContext)
{
- mxLocaleData.set( LocaleData::create(rxContext) );
+ mxLocaleData.set( LocaleData2::create(rxContext) );
cachedItem = nullptr;
}
diff --git a/i18npool/source/numberformatcode/numberformatcode.cxx b/i18npool/source/numberformatcode/numberformatcode.cxx
index 5fd2af898363..1ffafe63fa8c 100644
--- a/i18npool/source/numberformatcode/numberformatcode.cxx
+++ b/i18npool/source/numberformatcode/numberformatcode.cxx
@@ -20,13 +20,13 @@
#include <numberformatcode.hxx>
#include <com/sun/star/i18n/KNumberFormatUsage.hpp>
#include <com/sun/star/i18n/KNumberFormatType.hpp>
-#include <com/sun/star/i18n/LocaleData.hpp>
+#include <com/sun/star/i18n/LocaleData2.hpp>
#include <cppuhelper/supportsservice.hxx>
NumberFormatCodeMapper::NumberFormatCodeMapper(
const css::uno::Reference < css::uno::XComponentContext >& rxContext )
{
- m_xLocaleData.set( css::i18n::LocaleData::create( rxContext ) );
+ m_xLocaleData.set( css::i18n::LocaleData2::create( rxContext ) );
}
diff --git a/i18npool/source/transliteration/transliterationImpl.cxx b/i18npool/source/transliteration/transliterationImpl.cxx
index 9fb298aef29d..456b8793c1ab 100644
--- a/i18npool/source/transliteration/transliterationImpl.cxx
+++ b/i18npool/source/transliteration/transliterationImpl.cxx
@@ -21,7 +21,7 @@
#include <transliterationImpl.hxx>
#include <servicename.hxx>
-#include <com/sun/star/i18n/LocaleData.hpp>
+#include <com/sun/star/i18n/LocaleData2.hpp>
#include <com/sun/star/i18n/TransliterationType.hpp>
#include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
#include <com/sun/star/lang/XComponent.hpp>
@@ -140,7 +140,7 @@ TransliterationImpl::TransliterationImpl(const Reference <XComponentContext>& xC
numCascade = 0;
caseignoreOnly = true;
- mxLocaledata.set(LocaleData::create(xContext));
+ mxLocaledata.set(LocaleData2::create(xContext));
}
TransliterationImpl::~TransliterationImpl()
commit ad1bf2ce2612ffb025c8ef9967018db53527a796
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 12:15:57 2017 +0200
Supersede with XLocaleData5, LocaleData2, tdf#81671
Change-Id: I17332be77f9c66c4fcfb7e3f3144ec624b804f94
diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx
index a5d675988a75..be53b7558add 100644
--- a/include/unotools/localedatawrapper.hxx
+++ b/include/unotools/localedatawrapper.hxx
@@ -20,7 +20,7 @@
#ifndef INCLUDED_UNOTOOLS_LOCALEDATAWRAPPER_HXX
#define INCLUDED_UNOTOOLS_LOCALEDATAWRAPPER_HXX
-#include <com/sun/star/i18n/XLocaleData4.hpp>
+#include <com/sun/star/i18n/XLocaleData5.hpp>
#include <com/sun/star/i18n/LocaleItem.hpp>
#include <com/sun/star/i18n/reservedWords.hpp>
#include <rtl/ustring.hxx>
@@ -56,7 +56,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
static sal_uInt8 nLocaleDataChecking; // 0:=dontknow, 1:=yes, 2:=no
css::uno::Reference< css::uno::XComponentContext > m_xContext;
- css::uno::Reference< css::i18n::XLocaleData4 > xLD;
+ css::uno::Reference< css::i18n::XLocaleData5 > xLD;
LanguageTag maLanguageTag;
std::shared_ptr< css::i18n::Calendar2 > xDefaultCalendar;
std::shared_ptr< css::i18n::Calendar2 > xSecondaryCalendar;
diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx
index 3ae1ac104f70..77940997ace6 100644
--- a/unotools/source/i18n/localedatawrapper.cxx
+++ b/unotools/source/i18n/localedatawrapper.cxx
@@ -30,7 +30,7 @@
#include <com/sun/star/i18n/KNumberFormatUsage.hpp>
#include <com/sun/star/i18n/KNumberFormatType.hpp>
-#include <com/sun/star/i18n/LocaleData.hpp>
+#include <com/sun/star/i18n/LocaleData2.hpp>
#include <com/sun/star/i18n/CalendarFieldIndex.hpp>
#include <com/sun/star/i18n/CalendarDisplayIndex.hpp>
#include <com/sun/star/i18n/NumberFormatIndex.hpp>
@@ -85,7 +85,7 @@ LocaleDataWrapper::LocaleDataWrapper(
)
:
m_xContext( rxContext ),
- xLD( LocaleData::create(rxContext) ),
+ xLD( LocaleData2::create(rxContext) ),
maLanguageTag( rLanguageTag ),
bLocaleDataItemValid( false ),
bReservedWordValid( false ),
@@ -99,7 +99,7 @@ LocaleDataWrapper::LocaleDataWrapper(
)
:
m_xContext( comphelper::getProcessComponentContext() ),
- xLD( LocaleData::create(m_xContext) ),
+ xLD( LocaleData2::create(m_xContext) ),
maLanguageTag( rLanguageTag ),
bLocaleDataItemValid( false ),
bReservedWordValid( false ),
commit 281a84bd33d1c34d51c4a933d395f17bd36190c6
Author: Eike Rathke <erack at redhat.com>
Date: Fri Oct 27 12:04:35 2017 +0200
New LocaleItem::DECIMAL_SEPARATOR_ALTERNATIVE, tdf#81671
Change-Id: I1817d917621ccc3c81468132c558f9faa8c4ec4c
diff --git a/offapi/com/sun/star/i18n/LocaleItem.idl b/offapi/com/sun/star/i18n/LocaleItem.idl
index 97f6d586a667..6c3af39f9685 100644
--- a/offapi/com/sun/star/i18n/LocaleItem.idl
+++ b/offapi/com/sun/star/i18n/LocaleItem.idl
@@ -74,11 +74,17 @@ published constants LocaleItem
/// @see com::sun::star::i18n::LocaleDataItem::LongDateYearSeparator
const short LONG_DATE_YEAR_SEPARATOR = 16;
- //! New values may be inserted here if locale data provides them.
- //! Do not forget to adjust the COUNT value.
-
/// count of items available
const short COUNT = 17;
+
+ /// @see com::sun::star::i18n::LocaleDataItem2::decimalSeparatorAlternative
+ const short DECIMAL_SEPARATOR_ALTERNATIVE = 17;
+
+ /// count of items available
+ const short COUNT2 = 18;
+
+ //! New values may be appended here if locale data provides them.
+ //! Do not forget to introduce a new COUNTx value.
};
More information about the Libreoffice-commits
mailing list