NSNumberFormatter допускает только 4 цифры - PullRequest
2 голосов
/ 14 января 2012

Скажите, пожалуйста, почему мой NSNumberFormatter позволяет мне использовать только 4 цифры (т.е. £ 2222) вместо бесконечных цифр?

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *input = [textField.text stringByAppendingString:string];
    [textField setText:[self numberFormattedString:input]];
    return NO;
}
- (NSString *) numberFormattedString:(NSString *)str {
    str = [str stringByReplacingOccurrencesOfString:@"£" withString:@""];
    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-UK"];
    [formatter setLocale:locale];
    [locale release];
    [formatter setMaximumFractionDigits:3];
    [formatter setMinimumFractionDigits:0];
    return [formatter stringFromNumber:[NSNumber numberWithFloat:[str floatValue]]];
}

Edit -

Когда я набираю пятую цифру, имеющую уже 4 цифры внутри UITextField, текст textField сбрасывается обратно на пятую цифру, набранную в одиночку.

1008 * например *

Я ввожу 1000 в поле UITextField, затем я ввожу еще одну цифру 5. Поскольку 5 - пятая цифра, текст UITextField сбрасывается только до пятой цифры. UITextField теперь отображает «5».

ТИА.

XcodeDev

Ответы [ 2 ]

1 голос
/ 14 января 2012

Проблема в том, что запятая разрывается [NSString floatValue]. Когда вы начинаете вводить пятую цифру, str в конечном итоге выглядит как 1,0005 , которое floatValue преобразуется в значение 1, так как не знает, как обращаться с запятой и / или фактом что после него слишком много цифр. Добавить этот код

str = [str stringByReplacingOccurrencesOfString:@"," withString:@""];

в качестве первой или второй строки numberFormattedString, и она будет работать.

1 голос
/ 14 января 2012

Что, вероятно, происходит, когда пользователь печатает, форматировщик вставляет запятые в тысячу знаков.Вы не удаляете их, когда выполняете переформатирование, как со знаком фунта, поэтому в какой-то момент функция форматирования получает строку типа «1000».

Когда вы пытаетесь получить floatValueиз этого, чтобы преобразовать его обратно в NSNumber для переформатирования, floatValue возвращает 1, потому что он не может разобрать запятые.

Решение: добавьте эту дополнительную строку к вашей функции форматирования:

str = [str stringByReplacingOccurrencesOfString:@"," withString:@""];
...