0

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

ответ

0

И вот мой ответ на вопрос, я использую 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; 

}