summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/text/LocaleICU.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/text/LocaleICU.cpp')
-rw-r--r--Source/WebCore/platform/text/LocaleICU.cpp191
1 files changed, 25 insertions, 166 deletions
diff --git a/Source/WebCore/platform/text/LocaleICU.cpp b/Source/WebCore/platform/text/LocaleICU.cpp
index 51ba4aa35..0abe12ce3 100644
--- a/Source/WebCore/platform/text/LocaleICU.cpp
+++ b/Source/WebCore/platform/text/LocaleICU.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc. All rights reserved.
+ * Copyright (C) 2011,2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -81,38 +81,38 @@ LocaleICU* LocaleICU::currentLocale()
return currentLocale;
}
-void LocaleICU::setDecimalSymbol(unsigned index, UNumberFormatSymbol symbol)
+String LocaleICU::decimalSymbol(UNumberFormatSymbol symbol)
{
UErrorCode status = U_ZERO_ERROR;
int32_t bufferLength = unum_getSymbol(m_numberFormat, symbol, 0, 0, &status);
ASSERT(U_SUCCESS(status) || status == U_BUFFER_OVERFLOW_ERROR);
if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
- return;
+ return String();
Vector<UChar> buffer(bufferLength);
status = U_ZERO_ERROR;
unum_getSymbol(m_numberFormat, symbol, buffer.data(), bufferLength, &status);
if (U_FAILURE(status))
- return;
- m_decimalSymbols[index] = String::adopt(buffer);
+ return String();
+ return String::adopt(buffer);
}
-void LocaleICU::setDecimalTextAttribute(String& destination, UNumberFormatTextAttribute tag)
+String LocaleICU::decimalTextAttribute(UNumberFormatTextAttribute tag)
{
UErrorCode status = U_ZERO_ERROR;
int32_t bufferLength = unum_getTextAttribute(m_numberFormat, tag, 0, 0, &status);
ASSERT(U_SUCCESS(status) || status == U_BUFFER_OVERFLOW_ERROR);
if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
- return;
+ return String();
Vector<UChar> buffer(bufferLength);
status = U_ZERO_ERROR;
unum_getTextAttribute(m_numberFormat, tag, buffer.data(), bufferLength, &status);
ASSERT(U_SUCCESS(status));
if (U_FAILURE(status))
- return;
- destination = String::adopt(buffer);
+ return String();
+ return String::adopt(buffer);
}
-void LocaleICU::initializeDecimalFormat()
+void LocaleICU::initializeNumberLocalizerData()
{
if (m_didCreateDecimalFormat)
return;
@@ -122,155 +122,21 @@ void LocaleICU::initializeDecimalFormat()
if (!U_SUCCESS(status))
return;
- setDecimalSymbol(0, UNUM_ZERO_DIGIT_SYMBOL);
- setDecimalSymbol(1, UNUM_ONE_DIGIT_SYMBOL);
- setDecimalSymbol(2, UNUM_TWO_DIGIT_SYMBOL);
- setDecimalSymbol(3, UNUM_THREE_DIGIT_SYMBOL);
- setDecimalSymbol(4, UNUM_FOUR_DIGIT_SYMBOL);
- setDecimalSymbol(5, UNUM_FIVE_DIGIT_SYMBOL);
- setDecimalSymbol(6, UNUM_SIX_DIGIT_SYMBOL);
- setDecimalSymbol(7, UNUM_SEVEN_DIGIT_SYMBOL);
- setDecimalSymbol(8, UNUM_EIGHT_DIGIT_SYMBOL);
- setDecimalSymbol(9, UNUM_NINE_DIGIT_SYMBOL);
- setDecimalSymbol(DecimalSeparatorIndex, UNUM_DECIMAL_SEPARATOR_SYMBOL);
- setDecimalSymbol(GroupSeparatorIndex, UNUM_GROUPING_SEPARATOR_SYMBOL);
- setDecimalTextAttribute(m_positivePrefix, UNUM_POSITIVE_PREFIX);
- setDecimalTextAttribute(m_positiveSuffix, UNUM_POSITIVE_SUFFIX);
- setDecimalTextAttribute(m_negativePrefix, UNUM_NEGATIVE_PREFIX);
- setDecimalTextAttribute(m_negativeSuffix, UNUM_NEGATIVE_SUFFIX);
- ASSERT(!m_positivePrefix.isEmpty() || !m_positiveSuffix.isEmpty() || !m_negativePrefix.isEmpty() || !m_negativeSuffix.isEmpty());
-}
-
-String LocaleICU::convertToLocalizedNumber(const String& input)
-{
- initializeDecimalFormat();
- if (!m_numberFormat || input.isEmpty())
- return input;
-
- unsigned i = 0;
- bool isNegative = false;
- UnicodeString ustring;
- StringBuilder builder;
- builder.reserveCapacity(input.length());
-
- if (input[0] == '-') {
- ++i;
- isNegative = true;
- builder.append(m_negativePrefix);
- } else
- builder.append(m_positivePrefix);
-
- for (; i < input.length(); ++i) {
- switch (input[i]) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- builder.append(m_decimalSymbols[input[i] - '0']);
- break;
- case '.':
- builder.append(m_decimalSymbols[DecimalSeparatorIndex]);
- break;
- default:
- ASSERT_NOT_REACHED();
- }
- }
-
- builder.append(isNegative ? m_negativeSuffix : m_positiveSuffix);
-
- return builder.toString();
-}
-
-static bool matches(const String& text, unsigned position, const String& part)
-{
- if (part.isEmpty())
- return true;
- if (position + part.length() > text.length())
- return false;
- for (unsigned i = 0; i < part.length(); ++i) {
- if (text[position + i] != part[i])
- return false;
- }
- return true;
-}
-
-bool LocaleICU::detectSignAndGetDigitRange(const String& input, bool& isNegative, unsigned& startIndex, unsigned& endIndex)
-{
- startIndex = 0;
- endIndex = input.length();
- if (m_negativePrefix.isEmpty() && m_negativeSuffix.isEmpty()) {
- if (input.startsWith(m_positivePrefix) && input.endsWith(m_positiveSuffix)) {
- isNegative = false;
- startIndex = m_positivePrefix.length();
- endIndex -= m_positiveSuffix.length();
- } else
- isNegative = true;
- } else {
- if (input.startsWith(m_negativePrefix) && input.endsWith(m_negativeSuffix)) {
- isNegative = true;
- startIndex = m_negativePrefix.length();
- endIndex -= m_negativeSuffix.length();
- } else {
- isNegative = false;
- if (input.startsWith(m_positivePrefix) && input.endsWith(m_positiveSuffix)) {
- startIndex = m_positivePrefix.length();
- endIndex -= m_positiveSuffix.length();
- } else
- return false;
- }
- }
- return true;
-}
-
-unsigned LocaleICU::matchedDecimalSymbolIndex(const String& input, unsigned& position)
-{
- for (unsigned symbolIndex = 0; symbolIndex < DecimalSymbolsSize; ++symbolIndex) {
- if (m_decimalSymbols[symbolIndex].length() && matches(input, position, m_decimalSymbols[symbolIndex])) {
- position += m_decimalSymbols[symbolIndex].length();
- return symbolIndex;
- }
- }
- return DecimalSymbolsSize;
-}
-
-String LocaleICU::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();
+ Vector<String, DecimalSymbolsSize> symbols;
+ symbols.append(decimalSymbol(UNUM_ZERO_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_ONE_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_TWO_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_THREE_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_FOUR_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_FIVE_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_SIX_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_SEVEN_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_EIGHT_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_NINE_DIGIT_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_DECIMAL_SEPARATOR_SYMBOL));
+ symbols.append(decimalSymbol(UNUM_GROUPING_SEPARATOR_SYMBOL));
+ ASSERT(symbols.size() == DecimalSymbolsSize);
+ setNumberLocalizerData(symbols, decimalTextAttribute(UNUM_POSITIVE_PREFIX), decimalTextAttribute(UNUM_POSITIVE_SUFFIX), decimalTextAttribute(UNUM_NEGATIVE_PREFIX), decimalTextAttribute(UNUM_NEGATIVE_SUFFIX));
}
bool LocaleICU::initializeShortDateFormat()
@@ -501,13 +367,6 @@ unsigned LocaleICU::firstDayOfWeek()
#endif
#if ENABLE(INPUT_TYPE_TIME_MULTIPLE_FIELDS)
-
-String LocaleICU::localizedDecimalSeparator()
-{
- initializeDecimalFormat();
- return m_decimalSymbols[DecimalSeparatorIndex];
-}
-
static PassOwnPtr<Vector<String> > createFallbackAMPMLabels()
{
OwnPtr<Vector<String> > labels = adoptPtr(new Vector<String>());