Как установить значение строки валюты в UITextField, сохраняя кодировку? - PullRequest
1 голос
/ 29 марта 2012

Я занимаюсь разработкой приложения, в котором я хочу работать с различными форматами валют в зависимости от текущей локали.Используя 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 используется для принудительного форматирования всегда округлять до наименьшего десятичного разряда, например, даже для значений CHF).

Что яполучить в консоли это:

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 char 160), а затем UITextField перекодирует этот пробел как простой пробел (ASCII char 32).Любой известный обходной путь для этого поведения?Возможно, я мог бы просто заменить пробел неразрывным пробелом, но ... он будет работать для всех локалей?

Ответы [ 2 ]

0 голосов
/ 09 июля 2012

Я смог решить эту проблему, только расширив UITextField через пользовательский класс.В этом новом классе я поместил новый @property типа NSString, в котором я храню «вычисленное» строковое значение для текстового поля.Эта строка никогда не будет изменена и сохранит исходную кодировку содержимого текстового поля.

Когда вам нужно снова поработать с исходным нетронутым содержимым текстового поля, вы должны вместо этого обратиться к этому новому свойствуссылки на свойство text.

Использование отдельного контейнера строк - единственный способ избежать этих странных изменений кодировки.

0 голосов
/ 29 марта 2012

Возможный обходной путь: вы можете попытаться проанализировать только числовые значения (и знаки пунктуации) с помощью шаблона регулярных выражений и создать значение вашей валюты на основе этого числа.Если вы сделаете это таким образом, возможно, это будет еще более простительным для пользователя, если он наберет другой символ валюты или другие символы, которых там быть не должно ...

...