diff options
-rw-r--r-- | i18npool/source/characterclassification/cclass_unicode_parser.cxx | 14 | ||||
-rw-r--r-- | sal/rtl/math.cxx | 14 |
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 |