Ошибка с валютой iPhone для формата евро с Nsdecimalumber, используя NSLOCALE?
-
26-09-2019 - |
Вопрос
Мое приложение использует денежные значения, и я хотел бы представлять эти значения в валюте и форматах, что пользователь настроен на их 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 не возвращает правильные значения для евро.