String ICULocale::convertFromLocalizedNumber(const String& localized) { initializeDecimalFormat(); String input = localized.stripWhiteSpace(); if (!m_numberFormat || input.isEmpty()) return input; bool isNegative; unsigned startIndex; unsigned endIndex; if (!detectSignAndGetDigitRange(input, isNegative, startIndex, endIndex)) { // Input is broken. Returning an invalid number string. return "*"; } StringBuilder builder; builder.reserveCapacity(input.length()); if (isNegative) builder.append("-"); for (unsigned i = startIndex; i < endIndex;) { unsigned symbolIndex = matchedDecimalSymbolIndex(input, i); if (symbolIndex >= DecimalSymbolsSize) return "*"; if (symbolIndex == DecimalSeparatorIndex) builder.append('.'); else if (symbolIndex == GroupSeparatorIndex) { // Ignore group separators. } else builder.append(static_cast<UChar>('0' + symbolIndex)); } return builder.toString(); }
String Locale::convertFromLocalizedNumber(const String& localized) { initializeLocaleData(); String input = localized.removeCharacters(isASCIISpace); if (!m_hasLocaleData || input.isEmpty()) return input; bool isNegative; unsigned startIndex; unsigned endIndex; if (!detectSignAndGetDigitRange(input, isNegative, startIndex, endIndex)) return input; // Ignore leading '+', but will reject '+'-only string later. if (!isNegative && endIndex - startIndex >= 2 && input[startIndex] == '+') ++startIndex; StringBuilder builder; builder.reserveCapacity(input.length()); if (isNegative) builder.append('-'); for (unsigned i = startIndex; i < endIndex;) { unsigned symbolIndex = matchedDecimalSymbolIndex(input, i); if (symbolIndex >= DecimalSymbolsSize) return input; if (symbolIndex == DecimalSeparatorIndex) builder.append('.'); else if (symbolIndex == GroupSeparatorIndex) return input; else builder.append(static_cast<UChar>('0' + symbolIndex)); } String converted = builder.toString(); // Ignore trailing '.', but will reject '.'-only string later. if (converted.length() >= 2 && converted[converted.length() - 1] == '.') converted = converted.left(converted.length() - 1); return converted; }