2012-03-24 15 views
4

Ich habe eine Nummer in einer NSMutableString Instanz gespeichert, die ich mit Komma-Trennzeichen automatisch formatieren und dann das Ergebnis in einem UITextField anzeigen möchte.Formatieren einer Zeichenfolge, die eine Zahl mit Kommatrennung enthält

Ich habe versucht mit NSNumberFormatter formatieren als Währung, aber ich will es nicht zeigen Dezimalstellen, wenn das Original NSMutableString keine Dezimalstelle enthält.

Zum Beispiel:

  • Wenn die NSMutableString "1234567" enthält, sollte es zu formatieren als "1234567".
  • Wenn die NSMutableString enthält „1.234.567,1“, sollte es zu formatieren als „1,234,567.1“
  • Wenn die NSMutableString enthält „1234567,12“, sollte es zu formatieren als „1,234,567.12“

Die maximalen Dezimalstellen, dass die NSMutableString enthalten ist 2.

Jede Hilfe wird sehr geschätzt.

Danke!

Antwort

6

Beachten Sie, dass Sie das wirklich sein lokalisierende sollten, wenn Sie mit den Benutzern über diese interagieren, aber hier ist eine Möglichkeit, es zu tun:

- (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! Das hat perfekt funktioniert. Ich stimme der Lokalisierung zu, aber wie diese App für ein bestimmtes Land ist, habe ich mit Hardcoded Format gegangen. – staticnz

0

Sie suchen nach der -setMinimumFractionDigits: Methode auf NSNumberFormatter. Setzen Sie das auf 0 und es wird nur den Dezimalpunkt angezeigt, wenn Sie etwas nachlegen müssen.

+0

Danke, ich habe es ausprobiert und es funktioniert fast. Es hat ein paar Probleme, die mich verwirren. Wenn die Zeichenfolge "1234." enthält, wird nur "1234" angezeigt, damit der Benutzer nicht erkennt, dass das Drücken der Dezimaltaste verarbeitet wurde. Aus irgendeinem Grund, wenn die Zeichenfolge 9 Zeichen lang ist, ändert der Formatierer die Zahl, wenn es formatiert ist. Zum Beispiel, wenn ich 123456789 eingeben, formatiert es als "123.456.792" - irgendeine Idee, warum das passiert? Wenn es weniger als 9 Zeichen ist, tritt es ohne irgendein Problem ein. – staticnz

+0

Das ist mein Code: '// Erstelle Formatierer NSNumberFormatter * formatter = [[NSNumberFormatter Alloc] init]; [Formatierer setNumberStyle: NSNumberFormatterDecimalStyle]; [Formatierer setMinimumFractionDigits: 0]; [Formatierer setGroupingSeparator: @ ","]; entryFieldFloat = [entryField doubleValue]; NSNumber * entryFieldNumber = [NSNummer numberWithDouble: entryFieldFloat]; [enterPrice setText: [NSString stringWithFormat: @ "% @", [Formatierer stringFromNummer: entryFieldNumber]]]; ' – staticnz

0

Ich denke, das sollte es tun - ich habe eine if-Anweisung hinzugefügt, um zu überprüfen, ob es einen Dezimalpunkt im eingegebenen Wert gibt. "Ausgabe" in diesem Beispiel ist eine Eigenschaft, die ich an den Wert eines Textfelds gebunden habe, um das Ergebnis anzuzeigen.

-(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

Genau diese Methode aufrufen, einfach zu sein:

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