Ошибка с валютой iPhone для формата евро с Nsdecimalumber, используя NSLOCALE?

StackOverflow https://stackoverflow.com/questions/4236134

Вопрос

Мое приложение использует денежные значения, и я хотел бы представлять эти значения в валюте и форматах, что пользователь настроен на их iPhone, однако при тестировании, я, кажется, имею проблемы с немецким форматом евро.

У меня есть метод, который возвращает десятичное число (для хранения в основных данных) из строки отформатированной валюты. Строка фактически отформатирована другим (похожим) методом с использованием NSLOCALE.

Я проверен с Великобританией, США, японскими и немецкими местными, пока только Германия вызвала какие-либо проблемы.

Вот код, пропущенная строка, например: 2,56 €

+ (NSDecimalNumber*)TLCurrencyFormatFromString:(NSString*)strNumber {


NSNumberFormatter *fmtrCurrencyFromStr = nil;

fmtrCurrencyFromStr = [[NSNumberFormatter alloc] init];
[fmtrCurrencyFromStr setFormatterBehavior:NSNumberFormatterBehavior10_4];
[fmtrCurrencyFromStr setLocale:[NSLocale currentLocale]];
[fmtrCurrencyFromStr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtrCurrencyFromStr setGeneratesDecimalNumbers:YES];


NSLog(@"Currency Separator: %@", [fmtrCurrencyFromStr decimalSeparator]); //prints a comma
NSLog(@"Currency Code: %@", [fmtrCurrencyFromStr currencyCode]); //prints EUR

int currencyScale = [fmtrCurrencyFromStr maximumFractionDigits];

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE]; 

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];

NSLog(@"Currency Number = %@", [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]);

return [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

}

Принимая во внимание, что во всех других локалях он печатает 2,56 для хранения в основных данных как NSDECimalnumber.

Это было полезно?

Решение

Установка недвижимости:

[fmtrCurrencyFromStr setLenient:YES];

Исправляет проблему для Франции, Германии, Норвегии, Великобритании, США, Японии, Намбии и т. Д. ... Я не могу сказать, что это исправляет это для всех, потому что я не проверил все, но из всех тех, кого я так далеко это сработало.

Другие советы

я думать Ваша проблема с линией

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];

Попробуйте заменить его в основном эквивалентную линией

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber];

Вы установили generatesDecimalNumbers, Таким образом, два почти эквивалентны, кроме одного раздражающего случая: ноль.

Отправка сообщения в NIL гарантированно не делать ничего, и возвращает 0 для большинства стандартных типов (целое число (кроме не 64-битных целых чисел на старых 32-разрядных runtimes), плавающая точка, типы указателей); Это «возвращает» неинициализированную память, если метод возвращает структуру. Nsdecimal - это структура.

(Основная причина по сути, что время выполнения не знает, насколько велика структура, поэтому не знает, сколько памяти до нуля, следовательно, вы получаете «неинициализированную» память. Я обычно ударяю это, когда я делаю v.frame Не гарантируя, что v не ноль.)

РЕДАКТИРОВАТЬ: Конечно ты разное Проблема в том, почему Nsnumberformatterter не анализирует цену правильно. Это сложный. Я бы попробовал распределить символ валюты.

Я проверил, что на iOS 4.3 с использованием [Fixter Betlenient: Да] Флаг работал для меня, а также с использованием евро. Без этого установленного флага Fixter не возвращает правильные значения для евро.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top