Что не так с этим форматом строки (различное поведение на симуляторе и устройстве)? - PullRequest
3 голосов
/ 27 октября 2010

У меня есть этот блок кода, выполняемый при нажатии числа:

    NSString *currentValue = [@"" stringByAppendingFormat:@"%.02f", [[[[[textField text] stringByReplacingOccurrencesOfString:@"." withString:@""] stringByReplacingOccurrencesOfString:@"," withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""] doubleValue]/100.0f];
            //I am using this to obtain always a number with 2 decimals.

    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    [f setMinimumFractionDigits:2];
    [f setMaximumFractionDigits:2];
    [f setGroupingSeparator:@" "];

    NSNumber *currentNumberValue = [f numberFromString:currentValue];
    NSLog(@"1: %@", currentValue);
    NSLog(@"2: %@", [currentNumberValue stringValue]);

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

1: 0.03
2: 0.03

Если я запускаю его на устройстве, которое у меня есть:

1: 0.03
2: 0

Таким образом, в основном на устройстве форматированное число равно 0.
Я также заметил, что на симуляторе я получаю '. 'в качестве десятичного разделителя и на устройстве у меня' , '.

И из-за этого он никогда не идет дальше.Любое число, которое я нажимаю, все еще остается 0.

В чем проблема?

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Ваше устройство, очевидно, настроено на европейский (или где-либо) языковой стандарт, в котором в качестве десятичного разделителя используется ,.Попробуйте добавить эту строку после строки, в которой вы alloc и init используете свой форматировщик чисел:

[f setDecimalSeparator:@"."];

Или используйте метод setLocale (или измените языковой стандарт, установленный на вашем устройстве).

0 голосов
/ 27 октября 2010

Попробуй так:

NSString *currentValue = [textField text];
float currentFloat = [currentValue floatValue];
NSLog(@"%.2f",currentFloat); //string representation of floatValue
NSLog(@"%@",currentValue); //string currentValue
...