格式化包含逗号分隔的数字的字符串

sta*_*cnz 4 iphone objective-c nsnumberformatter ios

我有一个数字存储在一个NSMutableString实例中,我想用逗号分隔符自动格式化,然后在a中显示结果UITextField.

我曾尝试使用NSNumberFormatter格式化货币,但如果原件NSMutableString不包含小数位,我不希望它显示小数.

例如:

  • 如果NSMutableString包含"1234567",则格式为"1,234,567".
  • 如果NSMutableString包含"1234567.1",则格式为"1,234,567.1"
  • 如果NSMutableString包含"1234567.12",则格式为"1,234,567.12"

NSMutableString将包含的最大小数为2.

任何帮助是极大的赞赏.

谢谢!

lna*_*ger 6

请记住,如果您正在与此用户进行交互,那么您应该将其本地化,但是这是一种方法:

- (NSString *)formatString:(NSString *)string {
    // Strip out the commas that may already be here:
    NSString *newString = [string stringByReplacingOccurrencesOfString:@"," withString:@""];
    if ([newString length] == 0) {
        return nil;
    }

    // Check for illegal characters
    NSCharacterSet *disallowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
    NSRange charRange = [newString rangeOfCharacterFromSet:disallowedCharacters];
    if ( charRange.location != NSNotFound) {
        return nil;
    }

    // Split the string into the integer and decimal portions
    NSArray *numberArray = [newString componentsSeparatedByString:@"."];
    if ([numberArray count] > 2) {
        // There is more than one decimal point
        return nil;
    }

    // Get the integer
    NSString *integer           = [numberArray objectAtIndex:0];
    NSUInteger integerDigits    = [integer length];
    if (integerDigits == 0) {
        return nil;
    }

    // Format the integer.
    // You can do this by first converting to a number and then back to a string,
    // but I would rather keep it as a string instead of doing the double conversion.
    // If performance is critical, I would convert this to a C string to do the formatting.
    NSMutableString *formattedString = [[NSMutableString alloc] init];
    if (integerDigits < 4) {
        [formattedString appendString:integer];
    } else {
        // integer is 4 or more digits
        NSUInteger startingDigits = integerDigits % 3;
        if (startingDigits == 0) {
            startingDigits = 3;
        }
        [formattedString setString:[integer substringToIndex:startingDigits]];
        for (NSUInteger index = startingDigits; index < integerDigits; index = index + 3) {
            [formattedString appendFormat:@",%@", [integer substringWithRange:NSMakeRange(index, 3)]];
        }
    }

    // Add the decimal portion if there
    if ([numberArray count] == 2) {
        [formattedString appendString:@"."];
        NSString *decimal = [numberArray objectAtIndex:1];
        if ([decimal length] > 0) {
            [formattedString appendString:decimal];
        }
    }

    return formattedString;
}

// Test cases:
NSLog(@"%@", [self formatString:@"123456"]);
NSLog(@"%@", [self formatString:@"1234567."]);
NSLog(@"%@", [self formatString:@"12345678.1"]);
NSLog(@"%@", [self formatString:@"123456789.12"]);

// Output:
123,456
1,234,567.
12,345,678.1
123,456,789.12
Run Code Online (Sandbox Code Playgroud)