Как отформатировать UITextField с NSNumberFormatter?

Надеюсь, что это поможет другим, так как я не видел ни одного подобного поста в Интернете, который показывает, как форматировать текстовое поле, используя NSNumberFormatter но в то же время сохранить UITextField положение курсора там, где оно должно быть естественно. Те, потому что после форматирования NSString изнутри UITextField и установить его обратно в field Вы заканчиваете с курсором, помещенным в конец field, Также будет неплохо преобразовать его в Swift для тех, кто в этом нуждается.

1 ответ

И вот мой ответ на эту проблему, я использую UIKeyboardTypeNumberPad, но он также будет отлично работать с UIKeyboardTypeDecimalPad, если используются другие типы клавиатуры, не стесняйтесь добавлять регулярное выражение перед использованием следующего кода:

- (int)getCharOccurencies:(NSString *)character inString:(NSString *)string{

    NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[string length]];
    for (int i=0; i < [string length]; i++) {
        NSString *ichar  = [NSString stringWithFormat:@"%c", [string characterAtIndex:i]];
        [characters addObject:ichar];
    }

    int count = 0;
    for (NSString *ichar in characters) {
        if ([ichar isEqualToString:character]) {
            count++;
        }
    }
    return count;

}

- (void)selectTextForInput:(UITextField *)input atRange:(NSRange)range {
    UITextPosition *start = [input positionFromPosition:[input beginningOfDocument]
                                                 offset:range.location];
    UITextPosition *end = [input positionFromPosition:start
                                               offset:range.length];
    [input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSString *charUsedToFormat = @",";

    NSMutableString *textString = [NSMutableString stringWithString:[textField text]];
    [textField setTintColor:[UIColor darkGrayColor]];

    if ([string isEqualToString:charUsedToFormat]) {
        return NO;
    }

    if (range.location == 0 && [string isEqualToString:@"0"]) {
        return NO;
    }

    if ([[textString stringByReplacingCharactersInRange:range withString:string] length] == 0) {
        textField.text = @"";
        [self selectTextForInput:textField atRange:NSMakeRange(0, 0)];
        return NO;
    }

    NSString *replacebleString = [textString substringWithRange:range];

    if (string.length == 0 && [replacebleString isEqualToString:charUsedToFormat]) {

        NSRange newRange = NSMakeRange( range.location - 1, range.length);
        range = newRange;
        textString = [NSMutableString stringWithString:[textString stringByReplacingCharactersInRange:newRange withString:string]];
    }else{
         textString = [NSMutableString stringWithString:[textString stringByReplacingCharactersInRange:range withString:string]];
    }


    int commmaCountBefore = [self getCharOccurencies:charUsedToFormat inString:textString];

    textString = [NSMutableString stringWithString:[textString stringByReplacingOccurrencesOfString:charUsedToFormat withString:@""]];
    NSNumber *firstNumber = [NSNumber numberWithDouble:[textString doubleValue]];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    //just in case
    [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [formatter setGroupingSeparator:charUsedToFormat];
    [formatter setDecimalSeparator:@""];
    [formatter setMaximumFractionDigits:0];
    textString = [NSMutableString stringWithString:[formatter stringForObjectValue:firstNumber]];
    textField.text = textString;

    int commmaCountAfter = [self getCharOccurencies:charUsedToFormat inString:textString];
    int commaDif = commmaCountAfter - commmaCountBefore;


    int cursorPossition = (int)range.location + (int)string.length + commaDif;

    //set cursor position
    NSLog(@"cursorPossition: %d", cursorPossition);


    [self selectTextForInput:textField atRange:NSMakeRange(cursorPossition, 0)];

    return NO;

}
Другие вопросы по тегам