34 Stimmen

Formatierung von Fließkommazahlen in Objective C

Ich muss einen Float (einprägsamer Titel, er?) auf 2 Dezimalstellen formatieren, aber nur, wenn diese Dezimalstellen Werte haben, die nicht Null sind. Beispiel:

Ich habe ein NSTextField mit dem Namen 'answer', nachdem ich mit einigen Floats gerechnet habe, möchte ich meine Variable 'answerFloat' dem NSTextField 'answer' zuweisen. Bis jetzt habe ich:

[answer setStringValue:[NSString stringWithFormat:@"%.2f", answerFloat]];

Aber das setzt etwas wie 45 auf 45,00. Ich möchte, dass ganze Zahlen ohne Nullen angezeigt werden und dass alle Dezimalzahlen mit ihren jeweiligen Dezimalwerten angezeigt werden.

Muss ich irgendeine Art von Prüfung durchführen, bevor ich sie an stringWithFormat übergebe? Oder bietet NSString eine Möglichkeit, dies zu handhaben?

46voto

Mark Bessey Punkte 19301

Haben Sie schon die %g Formatbezeichner?

NSLog([NSString stringWithFormat:@"%g, %g", 45.0, 45.5]);

2010-01-12 19:54:38.651 foo[89884:10b] 45, 45.5

0 Stimmen

Ich dachte eigentlich, ich hätte %g ausprobiert. Ich habe es einfach so versucht: [answer setStringValue:[NSString stringWithFormat:@"%2.02g", answerFloat]]; und es funktionierte wie ein Zauber. danke!

4 Stimmen

Das Problem dabei ist, dass die Zahl, wenn sie groß genug ist, in Exponentialform gebracht wird. Ich glaube nicht, dass es eine Möglichkeit gibt, dieses geforderte Verhalten nur mit Format-Strings zu erreichen, ohne die Exponentialform zu riskieren.

24voto

Mark Suman Punkte 10300

Das Problem mit %g ist, dass es keine Möglichkeit gibt, den Rundungsschritt anzugeben (zumindest nicht, dass ich es finden kann).

Sie können NSNumberFormatter wie dieses verwenden, um Ihr Ergebnis mit einer Zahl zu erzielen, die eine unbestimmte Anzahl von Dezimalstellen hat.

double none = 5;
double one = 5.1;
double two = 5.01;
double lots = 5.918286558251858392107584219;

NSNumber *numberNone = [NSNumber numberWithDouble:none];
NSNumber *numberOne = [NSNumber numberWithDouble:one];
NSNumber *numberTwo = [NSNumber numberWithDouble:two];
NSNumber *numberLots = [NSNumber numberWithDouble:lots];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.roundingIncrement = [NSNumber numberWithDouble:0.01];
formatter.numberStyle = NSNumberFormatterDecimalStyle;

NSLog(@"%@",[formatter stringFromNumber:numberNone]);
NSLog(@"%@",[formatter stringFromNumber:numberOne]);
NSLog(@"%@",[formatter stringFromNumber:numberTwo]);
NSLog(@"%@",[formatter stringFromNumber:numberLots]);

Ausgabe:

2012-02-15 16:21:17.469 AwakeFromNib[53043:f803] 5
2012-02-15 16:21:17.470 AwakeFromNib[53043:f803] 5.1
2012-02-15 16:21:17.470 AwakeFromNib[53043:f803] 5.01
2012-02-15 16:21:17.471 AwakeFromNib[53043:f803] 5.92

1 Stimmen

Mark, brillante Antwort und Lösung eines Problems, das ich schon seit Ewigkeiten zu lösen versuche, danke ;-)

4voto

NSResponder Punkte 16747

NSNumberFormatter nachschlagen.

11 Stimmen

Ich wollte nur sagen, dass ich deinen Namen toll finde. Toller NSWitz.

4 Stimmen

Das passt zu meinem früheren Job bei Apple.

1 Stimmen

Bitte antworten Sie mit einer geeigneten Hilfe und eventuell mit einem Beispiel. Umso mehr, wenn Ihr Name NSResponder ist! Vielen Dank für Ihre Mitarbeit.

3voto

mrkj Punkte 2971

Für größtmögliche Flexibilität könnten Sie die Implementierung einer benutzerdefinierte Unterklasse von NSFormatter . Möglicherweise gibt es weitere wichtige Tipps in der Programmierhandbuch zur Datenformatierung für Cocoa .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X