Wie werden String-Konvertierungen in Objective-C durchgeführt?


145

Ich möchte einen String in einen Double konvertieren und ihn nach einigen Berechnungen wieder in einen String konvertieren.

Wie mache ich das in Objective-C?

Gibt es eine Möglichkeit, ein Double auch auf die nächste Ganzzahl zu runden?



Eine weitere Informationsquelle, die für Sie nützlich sein könnte, ist dieser Artikel über NSNumberFormatter: iphonesdkarticles.com/2008/11/…
jpm

Ich denke, die offizielle Dokumentation ist ziemlich gut ...

Antworten:


231

Sie können einen NSString mit in einen Double konvertieren

double myDouble = [myString doubleValue];

Das Runden auf das nächste int kann dann als erfolgen

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Ich bin mir ehrlich gesagt nicht sicher, ob es eine optimierte Möglichkeit gibt, wieder in einen String umzuwandeln als

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];

13
Sie möchten dies nicht unbedingt tun, da verschiedene Gebietsschemas Zahlen unterschiedlich formatieren. Einige schreiben "1000" für eintausend, während andere "1.000" und andere "1.000" schreiben - was bekommen Sie von - [NSString doubleValue]?
Chris Hanson

9
Double ist ein numerischer Datentyp - er enthält keine Formatierung. Das Aufrufen von [NSString doubleValue] würde 1000 zurückgeben, da es sich nur um eine Zahl handelt.
Andy

12
Und ein NSString kann keine Zahl enthalten, sondern nur eine Darstellung einer Zahl. Diese Darstellung kann in einer Vielzahl von Formaten vorliegen, die sich je nach Gebietsschema unterscheiden.
Chris Hanson

5
Vielleicht möchten Sie die Antwort von @Barry Wark in Ihre integrieren[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark

1
Was passiert, wenn der Zeichenfolgenwert keine gültige Doppelzeichenfolge ist, wird 0.0 von doubleValue zurückgegeben. Es scheint mir, dass die Lösung, die die Verwendung von NSNumberFormatter vorschlägt, besser ist, denn wenn die Zeichenfolge keine gültige Doppelzeichenfolge darstellt, wird nil zurückgegeben.
Kaydell

70

Um wirklich von einer Zeichenfolge in eine Zahl zu konvertieren, müssen Sie eine Instanz NSNumberFormatterverwenden, die für das Gebietsschema konfiguriert ist, aus dem Sie die Zeichenfolge lesen.

Verschiedene Gebietsschemas formatieren Zahlen unterschiedlich. In einigen Teilen der Welt COMMAwird es beispielsweise als Dezimaltrennzeichen verwendet, in anderen PERIOD- und das Tausendertrennzeichen (wenn verwendet) wird umgekehrt. Außer wenn es ein Raum ist. Oder überhaupt nicht anwesend.

Es hängt wirklich von der Herkunft des Inputs ab. Am sichersten ist es, eine NSNumberFormatterfür die Art und Weise zu konfigurieren, wie Ihre Eingabe formatiert ist, und sie zu verwenden -[NSFormatter numberFromString:], um eine NSNumberdaraus zu erhalten. Wenn Sie Konvertierungsfehler behandeln möchten, können Sie -[NSFormatter getObjectValue:forString:range:error:]stattdessen verwenden.


2
Sie können auch einen lokalisierten Scanner verwenden, z. B. einen, der mit [NSScanner localizedScannerWithString:] erstellt wurde. Anschließend scannt [scanner scanDouble: & aDouble] basierend auf dem aktuellen Gebietsschema des Benutzers doppelt.
Dreamlax

32

Zusätzlich zu olliejs Antwort können Sie von einem int zurück in einen String mit NSNumber's konvertieren stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValueBei einem NSNumberAufruf erhalten descriptionWithLocale:nilSie eine lokalisierte Zeichenfolgendarstellung des Werts. Ich bin mir nicht sicher, ob [NSString stringWithFormat:@"%d",myInt]Sie eine ordnungsgemäß lokalisierte Darstellung von erhalten myInt.


Danke Barry. Die von Ihnen gepostete Zeile NSNumber to stringValue funktionierte für mich, die Zeile NSString stringWithFormat jedoch nicht.
Markieren Sie den

7

Die Rundungsmethode von olliej ist für negative Zahlen falsch

  • 2,4 gerundet ist 2 (olliejs Methode macht das richtig)
  • −2.4 gerundet ist −2 (olliejs Methode gibt -1 zurück)

Hier ist eine Alternative

  int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Sie können natürlich eine Rundungsfunktion von math.h verwenden


7

Hier ist ein Arbeitsbeispiel von NSNumberFormatter, das die lokalisierte Nummer String (xCode 3.2.4, osX 10.6) liest, um anderen die Stunden zu ersparen, die ich gerade damit verbracht habe, herumzuspielen. Achtung: Während es nachfolgende Leerzeichen wie "8.765,4" verarbeiten kann, kann dies keine führenden Leerzeichen und keine streunenden Textzeichen verarbeiten. (Falsche Eingabezeichenfolgen: "8" und "8q" und "8 q".)

NSString *tempStr = @"8,765.4";  
     // localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
     // next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial

NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'", 
    tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release];  // good citizen

1
Was gibt numberFromString zurück, wenn die Zeichenfolge keine gültige Zeichenfolge ist?
Ben Clayton

numberFromString: Gibt ein NSNumber-Objekt zurück. Siehe NumberFormatting und NSNumberFormatter in Apple-Dokumenten. (Ich bin nicht sicher, wie NSNumber-Objekte "keine Nummer" oder "schlechte Nummer" codieren, aber ich sehe, dass es einen möglichen NSNull-Wert gibt.)
Miker

@BenClayton numberFromString gibt einen nilWert zurück, NSNumber*wenn er nicht analysiert werden kann. Ich kann das Problem, das Sie mit führenden Leerzeichen und streunenden Textzeichen hatten, nicht reproduzieren. IMO funktioniert es ordnungsgemäß. " 28.5 "parst als 28,5, und "gibberish28.5", "28.5gibberish"und "gibberish28.5gibberish"sind alle unparseable; " 2 8 . 5. "ist nicht analysierbar, aber das ist nicht ungewöhnlich.
jrh

3
// Converting String in to Double

double doubleValue = [yourString doubleValue];

// Converting Double in to String
NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
// .20f takes the value up to 20 position after decimal

// Converting double to int

int intValue = (int) doubleValue;
or
int intValue = [yourString intValue];

3

Wie wäre es mit der Verwendung der neuen Literal-Syntax (XCode> = 4.4) für die Konvertierung von einer Zahl in eine Zeichenfolge, die etwas kompakter ist?

int myInt = (int)round( [@"1.6" floatValue] );

NSString* myString = [@(myInt) description];

( Packt es als NSNumber ein und konvertiert es mit der Beschreibungsmethode von NSObjects in eine Zeichenfolge. )


2

Zum Runden sollten Sie wahrscheinlich die in math.h definierten C-Funktionen verwenden.

int roundedX = round(x);

Halten Sie die Optionstaste gedrückt und doppelklicken Sie roundin Xcode. Daraufhin wird die Manpage mit verschiedenen Funktionen zum Runden verschiedener Typen angezeigt.


1

Dies ist der einfachste Weg, den ich kenne:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;

1

Anhand dieses Beispiels können Sie die Konvertierungen in beide Richtungen sehen:

NSString *str=@"5678901234567890";

long long verylong;
NSRange range;
range.length = 15;
range.location = 0;

[[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];

NSLog(@"long long value %lld",verylong);

1

Konvertieren Sie den im Textfeld eingegebenen Text in eine Ganzzahl

double mydouble=[_myTextfield.text doubleValue];

Rundung auf das nächste Doppel

mydouble=(round(mydouble));

auf das nächste int runden (nur positive Werte berücksichtigen)

int myint=(int)(mydouble);

Konvertieren von Double in String

myLabel.text=[NSString stringWithFormat:@"%f",mydouble];

oder

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

Konvertieren von int in string

myLabel.text=[NSString stringWithFormat:@"%d",myint];

oder

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

1

Am Ende habe ich dieses praktische Makro verwendet:

#define STRING(value)               [@(value) stringValue]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.