summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i18npool/source/characterclassification/cclass_unicode_parser.cxx14
-rw-r--r--sal/rtl/math.cxx14
2 files changed, 24 insertions, 4 deletions
diff --git a/i18npool/source/characterclassification/cclass_unicode_parser.cxx b/i18npool/source/characterclassification/cclass_unicode_parser.cxx
index 3c040a5a0085..7af1dd8baf45 100644
--- a/i18npool/source/characterclassification/cclass_unicode_parser.cxx
+++ b/i18npool/source/characterclassification/cclass_unicode_parser.cxx
@@ -822,8 +822,18 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32
if ( nMask & ParserFlags::VALUE )
{
if (current == cGroupSep)
- nParseTokensType |= KParseTokens::GROUP_SEPARATOR_IN_NUMBER;
- if ((current == cDecimalSep || (bDecSepAltUsed = (cDecimalSepAlt && current == cDecimalSepAlt))) &&
+ {
+ if (getFlags(nextChar) & ParserFlags::VALUE_DIGIT)
+ nParseTokensType |= KParseTokens::GROUP_SEPARATOR_IN_NUMBER;
+ else
+ {
+ // Trailing group separator character is not a
+ // group separator.
+ eState = ssStopBack;
+ }
+ }
+ else if ((current == cDecimalSep ||
+ (bDecSepAltUsed = (cDecimalSepAlt && current == cDecimalSepAlt))) &&
++nDecSeps > 1)
{
if (nCodePoints == 2)
diff --git a/sal/rtl/math.cxx b/sal/rtl/math.cxx
index 447aabc365f8..9fd7983f8787 100644
--- a/sal/rtl/math.cxx
+++ b/sal/rtl/math.cxx
@@ -811,8 +811,12 @@ double stringToDouble(CharT const * pBegin, CharT const * pEnd,
if (!bDone) // do not recognize e.g. NaN1.23
{
- // leading zeros and group separators may be safely ignored
- while (p != pEnd && (*p == CharT('0') || *p == cGroupSeparator))
+ // Leading zeros and group separators between digits may be safely
+ // ignored. p0 < p implies that there was a leading 0 already,
+ // consecutive group separators may not happen as *(p+1) is checked for
+ // digit.
+ while (p != pEnd && (*p == CharT('0') || (*p == cGroupSeparator
+ && p0 < p && p+1 < pEnd && rtl::isAsciiDigit(*(p+1)))))
{
++p;
}
@@ -833,6 +837,12 @@ double stringToDouble(CharT const * pBegin, CharT const * pEnd,
{
break;
}
+ else if (p == p0 || (p+1 == pEnd) || !rtl::isAsciiDigit(*(p+1)))
+ {
+ // A leading or trailing (not followed by a digit) group
+ // separator character is not a group separator.
+ break;
+ }
}
// fraction part of mantissa