Форматирование строки, содержащей число с разделением запятыми - PullRequest
4 голосов
/ 25 марта 2012

У меня есть номер, сохраненный в экземпляре NSMutableString, который я хочу автоматически отформатировать с разделителями-запятыми, а затем отобразить результат в UITextField.

Я пытался использовать NSNumberFormatter для форматированияв качестве валюты, но я не хочу, чтобы он отображал десятичные дроби, если в оригинале NSMutableString нет десятичного знака.

Например:

  • Если NSMutableStringсодержит «1234567», он должен быть отформатирован как «1,234,567».
  • Если NSMutableString содержит «1234567.1», его следует отформатировать как «1,234,567.1»
  • Если NSMutableString содержит «1234567.12", он должен иметь формат" 1 234 567,12 "

Максимальное десятичное число, которое будет содержать NSMutableString, равно 2.

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 4 ]

6 голосов
/ 25 марта 2012

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

- (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
1 голос
/ 17 октября 2012

Просто вызовите этот метод, чтобы быть простым:

public static String GetCommaSeparatedCount(this Int32 Count)
    {
        // Check for The less-than character (<) is converted to &lt;
        String result = String.Format("{0:#,##0}", Count);

        return result;
    }
0 голосов
/ 25 марта 2012

Я думаю, что это должно быть сделано - я добавил оператор if, чтобы проверить, есть ли десятичная точка в набранном значении. «Вывод» в этом примере - это свойство, которое я связал со значением текстового поля, чтобы показать результат.

-(IBAction)doConversion:(id)sender{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
    [formatter setMaximumFractionDigits:2];
    [formatter setUsesGroupingSeparator:YES];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    double entryFieldFloat = [entryField doubleValue]; 
    if ([entryField.stringValue rangeOfString:@"."].length == 1) {
        formatter.alwaysShowsDecimalSeparator = YES;
        self.output =[formatter stringFromNumber:[NSNumber numberWithDouble:entryFieldFloat]];
    }else{
        formatter.alwaysShowsDecimalSeparator = NO;
        self.output =[formatter stringFromNumber:[NSNumber numberWithDouble:entryFieldFloat]];
    }
}
0 голосов
/ 25 марта 2012

Вы ищете метод -setMinimumFractionDigits: в NSNumberFormatter.Установите это значение в 0, и десятичная точка будет отображаться только в том случае, если после нее есть что-то поставить.

...