Wie füge ich alle drei Ziffern in Ziel C Kommas hinzu?

72

Wenn ich eine Nummer habe, int aNum = 2000000wie formatiere ich diese, damit ich sie als NSString 2.000.000 anzeigen kann?

RexOnRoids
quelle

Antworten:

80

Führen Sie keine eigene Zahlenformatierung durch. Sie werden mit ziemlicher Sicherheit nicht alle Randfälle richtig verstehen oder alle möglichen Gebietsschemas korrekt behandeln. Verwenden Sie das NSNumberFormatterzum Formatieren numerischer Daten in eine lokalisierte Zeichenfolgendarstellung.

Sie würden die NSNumberFormatterInstanzmethode verwenden -setGroupingSeparator:, um das Gruppentrennzeichen auf @","(oder noch besser [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]; danke @ntesler) -setGroupingSize:zu setzen und alle 3 Ziffern ein Gruppentrennzeichen zu setzen.

Barry Wark
quelle
Cool, bin ich fertig, nachdem ich -setGroupingSize :? Oder muss ich -setFormat :?
RexOnRoids
10
Besser mit lokalisierende[formatter setGroupingSeparator: [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]];
nate
NSNumberformatter ist nicht gut genug, insbesondere wenn Sie auf internationale Formate vorbereitet sein müssen.
Brainray
NSNumberFormatter verarbeitet NSDecimalNumber nicht gut genug. Es verliert an Präzision.
Big Money
Was könnte die richtige Lösung sein, wenn ich Punkt (.) Anstelle von Komma (,) möchte?
Birju
148

Verwenden Sie NSNumberFormatter.

Speziell:

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

NSString *formatted = [formatter stringFromNumber:[NSNumber numberWithInteger:2000000]];

[formatter release];

Standardmäßig NSNumberFormatterwird das aktuelle Gebietsschema verwendet, sodass die Gruppentrennzeichen standardmäßig auf die richtigen Werte gesetzt werden. Der Schlüssel ist, sich daran zu erinnern, einen Zahlenstil festzulegen.

Nik
quelle
Ja, ich hatte ein ähnliches Problem, es würde nicht "200.000" analysieren, selbst wenn ich das Gebietsschema auf Englisch UK gesetzt hätte, bis ich den Stil auf NSNumberFormatterDecimalStyle gesetzt hätte. Denke, es würde nur die Zeichenfolge "200000" verstehen
brian.clear
2
@MCKapur warum sagst du, neu ist alte Schule? Es macht keinen Sinn, mehr zu tippen, um dasselbe zu tun, nicht wahr?
Julio Bailon
1
@ JulioBailon WOW das war wie vor 2 Jahren. Ehrlich gesagt erinnere ich mich nicht, warum ich sagte + neu war alte Schule. Ist es nicht. Ich bevorzuge jedoch + alloc-init aus Gründen der Konsistenz, + new fühlte sich immer wie eine unnötige Verknüpfung an, und + alloc-init half mir dabei, die gute Code-Praxis beizubehalten.
MCKapur
Was ist, wenn ich sowohl Kommas als auch Dezimalstellen möchte?
GeneCode
34

Es gibt eine statische MethodeNSNumberFormatter , die genau das tut, was Sie brauchen:

int aNum = 2000000;
NSString *display = [NSNumberFormatter localizedStringFromNumber:@(aNum)
                                                     numberStyle:NSNumberFormatterDecimalStyle];

Diese Methode ist etwas prägnanter als das Erstellen einer neuen, NSNumberFormatterwenn Sie keine zusätzliche Konfiguration des Formatierers vornehmen müssen.

Phil Calvin
quelle
18

Sogar einfacher:

NSNumber *someNumber = @(1234567890);
NSString *modelNumberString = [NSString localizedStringWithFormat:@"%@", someNumber];
NSLog(@"Number with commas: %@", modelNumberString);

Mitarbeiter haben mir das heute gerade beigebracht. #tolle

Yujean
quelle
1
localizedStringWithFormat hängt von Ihrem aktuellen Gebietsschema ab und erzeugt für verschiedene Sprachen unterschiedliche Trennzeichen.
Alexander Belyavskiy
16

Denken Sie einige, wie ich diesen Beitrag auf der Suche nach Beispiel bekommen werde. Wenn Sie also mit Zahlen arbeiten, achten Sie auf die nächsten Parameter:

setNumberStyle:NSNumberFormatterCurrencyStyle // if you are working with currency

Es könnte auch sein

setNumberStyle:NSNumberFormatterDecimalStyle

Der gesamte Code ist für ARC.

Wenn Sie mit Integer arbeiten und Ergebnisse wie 200.000 erhalten möchten

int value = 200000;
NSNumberFormatter * formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString * newString =  [formatter stringFromNumber:[NSNumber numberWithInteger:value]];

Wenn Sie mit Float arbeiten und Ergebnisse wie 200.000,00 erhalten möchten

float value = 200000;
NSNumberFormatter * formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2]; // Set this if you need 2 digits
NSString * newString =  [formatter stringFromNumber:[NSNumber numberWithFloat:value]];

BEARBEITEN

Um die Fähigkeit zu haben, verschiedene digitale Separatoren zu verwenden, verwenden Sie NSLocale . Zum Code hinzufügen, wo NSLocalein der Gebietsschema-ID angegeben:

[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]];

oder verwenden Sie die aktuelle lokale:

[formatter setLocale:[NSLocale currentLocale]];
Nazir
quelle
Wenn ich Punkt (.) Anstelle von Komma (,) möchte, dann?
Birju
1
Die einfache Art und Weise, wie wir NSLocalenur add verwenden [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]];, um verschiedene Trennzeichen zu verwenden, hängt vom lokalen digitalen Stil ab
Nazir
Wie man 5.234,00 anzeigt ... ich muss 2 Dezimalzahlen anzeigen
Yalamandarao
@Singapore verwenden setMaximumFractionDigits, um die benötigten Ziffern einzurichten
Nazir
1

Schnelle Version

let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.maximumFractionDigits = decimalPlaces
let result = formatter.stringFromNumber(NSNumber(double: 8.0))

Von http://ios.eezytutorials.com

Raj iOS
quelle
0

Eine einfache Lösung könnte dies sein. Meine Antwort ist fast dieselbe wie die von @ Nazir, aber mit einem kleinen Trick.

double current_balance = 2000000.00;

NSNumberFormatter * formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
//[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];  //if you want for currency with $ sign
[formatter setMinimumFractionDigits:2]; // Set this if you need 2 digits
[formatter setMaximumFractionDigits:2]; // Set this if you need 2 digits
NSString * currency_format =  [NSString stringWithFormat:@"%@", [formatter stringFromNumber:[NSNumber numberWithDouble:current_balance]]];
Julfikar
quelle
0

Für Swift 4.0

let formatter = NumberFormatter()

formatter.numberStyle = .decimal

formatter.minimumFractionDigits = 2

formatter.maximumFractionDigits = 2

let result = formatter.string(from: NSNumber(value: 123456))
Sandip Patel - SM
quelle
0

Für diejenigen, die dies mit Zahlenfolgen und nicht nur mit ganzen Zahlen (dh großen Zahlen) tun müssen, habe ich das folgende Makro erstellt:

#define addCommas(__string) (\
(^NSString *(void){\
NSString *__numberString = __string;\
NSString *__integerPortion = __numberString;\
NSString *__decimalPortion = @"";\
if ([__string containsString:@"."]) {\
__integerPortion = [__numberString componentsSeparatedByString:@"."][0];\
__decimalPortion = st(@".%@", [__numberString componentsSeparatedByString:@"."][1]);\
}\
int __i = (int)__integerPortion.length-3;\
while (__i > 0) {\
__integerPortion = st(@"%@,%@", substringInRange(__integerPortion, 0, __i), substringInRange(__integerPortion, __i, (int)__integerPortion.length));\
__i -= 3;\
}\
__numberString = st(@"%@%@", __integerPortion, __decimalPortion);\
return __numberString;\
})()\
)
Albert Renshaw
quelle