NSNumberFormatter не разрешает десятичный ввод - PullRequest
1 голос
/ 15 января 2012

Если я введу десятичную точку '.'в моем UITextField вызываемый модуль форматирования чисел не распознает десятичную точку и продолжает, как если бы десятичная точка не была введена.Т.е. если я введу 200,9, десятичная точка не будет отображаться в текстовом поле, а текст этого текстового поля будет 2009.

Я хочу ограничить количество цифр после десятичной точки до 2, как я полагаю,делаю ниже.Пожалуйста, вы можете сказать мне, что я делаю, чтобы вызвать это?

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    BOOL isDeleting = [textField.text substringWithRange:range].length > string.length;
    int index = [textFields indexOfObject:textField];
    NSString *input;

    if (isDeleting == NO)
        input = [textField.text stringByAppendingString:string];
    else {
        NSMutableString *str = [textField.text mutableCopy];
        [str deleteCharactersInRange:range];
        input = [[str copy] autorelease];
        [str release];
    }

    if ([input isEqualToString:@"£"] || ([input isEqualToString:@""] && index != 1)) {
        [textField setText:@"£"];
    }
    else {
        if (index != 1)
            [textField setText:[self numberFormattedString:input]];
        else 
            [textField setText:input];
    }

    return NO;
}
- (NSString *) numberFormattedString:(NSString *)str {
    str = [str stringByReplacingOccurrencesOfString:@"£" withString:@""];
    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 setAllowsFloats:YES];
    [formatter setMaximumFractionDigits:3];
    [formatter setMinimumFractionDigits:0];
    [formatter setDecimalSeparator:@"."];
    return [formatter stringFromNumber:[NSNumber numberWithFloat:[str floatValue]]];
}

TIA.

Ответы [ 2 ]

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

Допустим, вы вводите число 100, а затем десятичную точку. Когда numberFormattedString вызывается со строкой £100., он избавляется от £, и str будет содержать строку 100., которая [str floatValue] преобразуется в значение с плавающей запятой 100, и, наконец, ваш форматировщик чисел выплевывает его обратно как строка £100 без десятичной точки. Таким образом, в основном [str floatValue] убивает вашу десятичную точку.

Одним из решений является проверка того, когда вы получите десятичную точку в качестве строки замены в методе делегата текстового поля, и пропустите вызов numberFormattedString в этом случае. Затем, когда пользователь вводит следующую цифру, вы можете продолжить вызывать numberFormattedString, и преобразование должно произойти правильно. Вам просто нужно убедиться, что пользователь может ввести только одну десятичную точку.

РЕДАКТИРОВАТЬ: я только что понял, что мое предлагаемое решение по-прежнему не будет работать, если вы введете 0 после десятичной точки (например, 100,0), но я уверен, что есть небольшая настройка, которую вы можете найти, чтобы решить эту проблему.

0 голосов
/ 19 января 2013
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSCharacterSet *numSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    int charCount = [newString length];

    if ([newString rangeOfCharacterFromSet:[numSet invertedSet]].location != NSNotFound
        || [string rangeOfString:@"."].location != NSNotFound
        || charCount > 15) {
        return NO;
    }

//    if (charCount == 4 || charCount == 9 || charCount==13) {
//         newString = [newString stringByAppendingString:@"."];
//    }
    NSLog(@"IN method");
    textField.text = newString;

    return NO;
}
...