2012-03-24 3 views
4

У меня есть номер, хранящийся в экземпляре 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.

Любая помощь очень ценится.

Спасибо!

ответ

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:@"."] 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 
+0

Wow thanks! Это сработало отлично. Я соглашаюсь на локализацию, однако, поскольку это приложение предназначено для конкретной страны, я пошел с жестко запрограммированным форматом. – staticnz

0

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

+0

Спасибо, я пробовал это, и он почти работает. У меня есть пара вопросов, которые меня путают. Когда строка содержит «1234.», она отображает только «1234», поэтому пользователь не поймет, что их нажатие десятичного ключа было обработано. По какой-то причине, если строка содержит 9 символов, форматтер изменяет номер при его форматировании. Например, если я вхожу в 123456789, он форматы «123 456 792» - любая идея, почему это происходит? Если оно меньше 9 символов, оно вводится без каких-либо проблем. – staticnz

+0

Это мой код: // Создать форматирование NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; [formatter setNumberStyle: NSNumberFormatterDecimalStyle]; [formatter setMinimumFractionDigits: 0]; [formatter setGroupingSeparator: @ ","]; entryFieldFloat = [entryField doubleValue]; NSNumber * entryFieldNumber = [NSNumber numberWithDouble: entryFieldFloat]; [enterPrice setText: [NSString stringWithFormat: @ "% @", [formatter stringFromNumber: entryFieldNumber]]]; ' – staticnz

0

Я думаю, что это должно сделать это. Я добавил инструкцию 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]]; 
    } 
} 
1

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

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; 
    }