локализация валют в приложении iphone - PullRequest
2 голосов
/ 26 июня 2009

Я тестирую свое приложение. Все работает нормально, за исключением случаев, когда я меняю локали в Германию.

Обычно вы вводите 2 значения в местной валюте, происходит расчет, и пользователь получает информацию обратно.

Цифровые вводы пользователей обрабатываются хорошо. То есть, в «Editing Did End» выполняется метод, который преобразует число в эквивалент в местной валюте. Таким образом, если пользователи из США введут 10000, им будет возвращено 10 000 долларов. Вот код:

- (NSMutableString *) formatTextValueToCurrency: (NSMutableString *) numberString {


NSNumber *aDouble = [NSNumber numberWithFloat: [numberString floatValue]];
NSMutableString *aString = [NSMutableString stringWithCapacity: 20];
NSLocale *theLocale;


NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];

[currencyStyle setFormatterBehavior:NSNumberFormatterBehavior10_4];
[currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];
theLocale = [NSLocale currentLocale];
[currencyStyle setLocale: theLocale];

[aString appendString: [currencyStyle stringFromNumber:aDouble]];   

[currencyStyle release];

return aString;

}

Однако проблема возникает, когда я хочу обработать вышеуказанные значения валюты, чтобы получить информацию о пользователе. Таким образом, приложению теперь нужно получить 10000 от 10 000,00 долларов США (или любой другой валюты) для отправки в метод расчета. Вот код:

- (float) getValueFromCurrency: (id) sender {

NSNumber *aDouble = [NSNumber numberWithFloat: 0.0];
UITextField *textField = (UITextField *) sender;
NSMutableString *aString= [NSMutableString stringWithCapacity: 20]; 
NSLocale *theLocale;

float result;

NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];    

[currencyStyle setFormatterBehavior:NSNumberFormatterBehavior10_4];
[currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];

theLocale = [NSLocale currentLocale];

[currencyStyle setLocale: theLocale];
NSLog(@"The locale is %@", currencyStyle.locale.localeIdentifier); 
//Above NSLog looks good because it returns de_DE 

[aString appendString: textField.text];
//The append from text field to string is good also

aDouble = [currencyStyle numberFromString: aString];
//For some reason, nil is returned

result = [aDouble floatValue];

[currencyStyle release];

return result;
}

Почему-то в США, Великобритании, Японии и Ирландии все в порядке.

Страны континентальной Европы не работают.

Любой совет, как это исправить, был бы великолепен.

1 Ответ

2 голосов
/ 26 июля 2009

Учитывая, что код работает для США, Великобритании, Японии и Ирландии, но не для континентальной Европы (Германия), я бы проверил, как вы обращаетесь с тысячами и десятичным разделителем.

То есть в странах, которые работают с вашим кодом, разделитель тысяч - это запятая, а десятичная дробь - это точка (точка). Таким образом, 10000 долларов и 50 центов будут 10000,50.

В континентальной Европе (Германия и т. Д.) Разделитель тысяч - это точка (точка остановки), а разделитель десятичной дроби - запятая. Таким образом, вышеуказанное значение в Германии будет 10.000,50

NSNumberFormatter имеет два метода, которые вы можете посмотреть: -

  • (NSString *) currencyDecimalSeparator
  • (NSString *) currencyGroupingSeparator

Вы можете найти список стран в WIKI (http://en.wikipedia.org/wiki/Decimal_separator) для каждого из форматов и проверить, относится ли ваша проблема только к одной группе или нет.

Надеюсь, это поможет.

Приветствия

Кевин

...