Я разрабатываю приложение, в котором я хочу обрабатывать разные форматы валюты, в зависимости от текущей локали. Используя NSNumberFormatter
, я могу без проблем правильно перевести число в строку и обратно.
Но если я помещу строковое значение в UITextField
и позже получу его обратно, я не смогу преобразовать строку обратно в число и вместо этого получу значение nil
.
Вот пример кода для объяснения проблемы:
NSNumberFormatter *nf = [Utils currencyFormatter];
NSNumber *n = [NSNumber numberWithInt:10000];
NSString *s = [nf stringFromNumber:n];
NSLog(@"String value = %@", s);
UITextField *t = [[UITextField alloc] init];
// I put the string into the text field ...
t.text = s;
// ... and later I get the value back
s = t.text;
NSLog(@"Text field text = %@", s);
n = [nf numberFromString:s];
NSLog(@"Number value = %d", [n intValue]);
где метод currencyFormatter
определяется следующим образом:
+ (NSNumberFormatter *)currencyFormatter
{
static NSNumberFormatter *currencyFormatter;
if (!currencyFormatter) {
currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormatter setLocale:[NSLocale currentLocale]];
if ([currencyFormatter generatesDecimalNumbers] || [[currencyFormatter roundingIncrement] floatValue] < 1) {
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setRoundingIncrement:[NSNumber numberWithFloat:0.01]];
}
}
return currencyFormatter;
}
(Внутренний if
используется для того, чтобы средство форматирования всегда округляло до наименьшего десятичного разряда, например, даже для значений в швейцарских франках).
Что я получаю в консоли, это:
2012-03-29 00:35:38.490 myMutuo2[45396:fb03] String value = € 10.000,00
2012-03-29 00:35:38.494 myMutuo2[45396:fb03] Text field text = € 10.000,00
2012-03-29 00:35:38.497 myMutuo2[45396:fb03] Number value = 0
Странно то, что символ пробела между €
и 1
в первой строке отображается в консоли в виде точки в воздухе, а во второй строке эта точка исчезает. Я считаю, что это проблема, связанная с кодировкой.
Может ли кто-нибудь помочь мне решить эту проблему? Спасибо!
Изменить
Я изменил свой тестовый код на это:
NSNumberFormatter *nf = [Utils currencyFormatter];
NSNumber *n = [NSNumber numberWithInt:10000];
NSString *s = [nf stringFromNumber:n];
NSLog(@"String value = %@ (space code is %d)", s, [s characterAtIndex:1]);
UITextField *t = [[UITextField alloc] init];
t.text = s;
s = t.text;
NSLog(@"Text field text = %@ (space code is %d)", s, [s characterAtIndex:1]);
n = [nf numberFromString:s];
NSLog(@"Number value = %d", [n intValue]);
чтобы обнаружить это:
2012-03-29 02:29:43.402 myMutuo2[45993:fb03] String value = € 10.000,00 (space code is 160)
2012-03-29 02:29:43.405 myMutuo2[45993:fb03] Text field text = € 10.000,00 (space code is 32)
2012-03-29 02:29:43.409 myMutuo2[45993:fb03] Number value = 0
NSNumberFormatter
записывает пробел как неразрывный пробел (ASCII-символ 160), а затем UITextField
повторно кодирует этот пробел как простой пробел (ASCII-символ 32). Любое известное обходное решение для этого поведения? Возможно, я мог бы просто заменить пробел неразрывным пробелом, но... будет ли это работать для всех локалей?