How do you dynamically format a number to have com

2020-01-30 23:44发布

I want to have commas dynamically added to my numeric UITextField entry while the user is typing.

For example: 123,456 and 12,345,678, but not like this 123,45 or 123,4567.

How does one automatically append the commas while a user is typing a number in Objective-C?

Edit: I'd also like to be able to allow the user to input decimals.

8条回答
看我几分像从前
2楼-- · 2020-01-31 00:13

EDIT See Lindsey Scott's answer for an updated, correct version.

This is based on Lindsey Scott's previous answer, but updated to account for 0's entered after the decimal:

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

    if (textField == _questionPoolNameTextField) {
        return YES;
    }

    //For 0's after the decimal point:
    if ([string isEqualToString:@"0"] && (0 <= (int)[textField.text rangeOfString:@"."].location)) {
        if ([textField.text rangeOfString:@"."].location < range.location) {
            return YES;
        }
    }

    // First check whether the replacement string's numeric...
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    bool isNumeric = [string isEqualToString:filtered];

    // Then if the replacement string's numeric, or if it's
    // a backspace, or if it's a decimal point and the text
    // field doesn't already contain a decimal point,
    // reformat the new complete number using
    // NSNumberFormatterDecimalStyle
    if (isNumeric ||
        [string isEqualToString:@""] ||
        ([string isEqualToString:@"."] &&
         [textField.text rangeOfString:@"."].location == NSNotFound)) {

            NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
            [numberFormatter setGroupingSeparator:@","];
            [numberFormatter setGroupingSize:3];
            [numberFormatter setDecimalSeparator:@"."];
            [numberFormatter setMaximumFractionDigits:20];
            [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];

            // Combine the new text with the old; then remove any
            // commas from the textField before formatting
            NSString *combinedText = [textField.text stringByReplacingCharactersInRange:range withString:string];
            NSString *numberWithoutCommas = [combinedText stringByReplacingOccurrencesOfString:@"," withString:@""];
            NSNumber *number = [numberFormatter numberFromString:numberWithoutCommas];

            NSString *formattedString = [numberFormatter stringFromNumber:number];

            // If the last entry was a decimal at the end of the
            // re-add it here because the formatter will naturally
            // remove it.
            if ([string isEqualToString:@"."] &&
                range.location == textField.text.length) {
                formattedString = [formattedString stringByAppendingString:@"."];
            }

            textField.text = formattedString;
        }

    // Return no, because either the replacement string is not
    // valid or it is and the textfield has already been updated
    // accordingly
    return NO;
}
查看更多
甜甜的少女心
3楼-- · 2020-01-31 00:14

Windy please keep in mind the commas should get add to the number itself, not like user has to enter them.

First

// Add a "textFieldDidChange" notification method to the text field control.
[textField addTarget:self 
          action:@selector(textFieldDidChange:) 
forControlEvents:UIControlEventEditingChanged];

You have to change to change the Text yourself. And the Code that will add the commas is

-(void) textFieldDidChange {

    NSNumberFormatter *formatter = [NSNumberFormatter new];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; // this line is important!

    NSString *formatted = [formatter stringFromNumber:[NSNumber numberWithInteger:2000000]];
    NSLog(@"the Formatted String is  %@",formatted);

   textField.text = formatted;
}
查看更多
登录 后发表回答