Comment faire des conversions de chaînes en Objective-C?

145

Je veux convertir une chaîne en un double et après avoir fait des calculs dessus, la reconvertir en chaîne.

Comment faire cela dans Objective-C?

Existe-t-il également un moyen d'arrondir un double à l'entier le plus proche?

rksprst
la source
Suite à la réponse de Chris Hanson, vous pouvez en savoir plus sur les formateurs de nombres, leur comportement et les chaînes de formatage, à partir de NSNumberFormatter sur Mac OS X 10.4 dans Data Formatting Programming Guide For Cocoa .
mmalc
Une autre source d'information qui pourrait vous être utile est cet article sur NSNumberFormatter: iphonesdkarticles.com/2008/11/…
jpm
Je pense que la documentation officielle est plutôt bonne ...

Réponses:

231

Vous pouvez convertir une NSString en double avec

double myDouble = [myString doubleValue];

L'arrondi au plus proche int peut alors être fait comme

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

Honnêtement, je ne suis pas sûr qu'il existe un moyen plus simple de reconvertir en chaîne que

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
olliej
la source
13
Vous ne voulez pas nécessairement faire cela, car différents paramètres régionaux formatent les nombres différemment. Certains écriront "1000" pour mille, tandis que d'autres écriront "1,000" et d'autres "1,000" - que obtenez-vous de - [NSString doubleValue]?
Chris Hanson
9
Double est un type de données numérique - il ne contient aucun formatage. L'appel de [NSString doubleValue] renverrait 1000 car ce n'est qu'un nombre.
Andy
12
Et une NSString ne peut pas contenir un nombre, seulement une représentation d'un nombre. Cette représentation peut être dans l'un des divers formats qui diffèrent selon les paramètres régionaux.
Chris Hanson
5
vous voudrez peut-être intégrer la réponse de @Barry Wark dans la vôtre,[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark
1
Que faire si la valeur de la chaîne n'est pas une chaîne double valide, alors 0.0 sera renvoyé par doubleValue. Il me semble que la solution suggérant l'utilisation de NSNumberFormatter est meilleure car si la chaîne ne représente pas une chaîne double valide, alors nil est renvoyé.
Kaydell
70

Pour vraiment convertir correctement une chaîne en nombre, vous devez utiliser une instance de NSNumberFormatterconfiguré pour la locale à partir de laquelle vous lisez la chaîne.

Différents paramètres régionaux formateront les nombres différemment. Par exemple, dans certaines parties du monde, il COMMAest utilisé comme séparateur décimal tandis que dans d'autres, il l'est PERIOD- et le séparateur des milliers (lorsqu'il est utilisé) est inversé. Sauf quand c'est un espace. Ou pas du tout présent.

Cela dépend vraiment de la provenance de l'entrée. La chose la plus sûre à faire est de configurer un NSNumberFormatterpour la façon dont votre entrée est formatée et de l'utiliser -[NSFormatter numberFromString:]pour en obtenir une NSNumber. Si vous souhaitez gérer les erreurs de conversion, vous pouvez utiliser à la -[NSFormatter getObjectValue:forString:range:error:]place.

Chris Hanson
la source
2
Ou vous pouvez utiliser un scanner localisé, par exemple celui créé avec [NSScanner localizedScannerWithString:], puis [scanner scanDouble: & aDouble] analysera en double en fonction des paramètres régionaux actuels de l'utilisateur.
dreamlax
32

En plus de la réponse d'olliej, vous pouvez convertir un int en une chaîne avec NSNumber's stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValuesur un NSNumberappel descriptionWithLocale:nil, vous donnant une représentation sous forme de chaîne localisée de value. Je ne sais pas si [NSString stringWithFormat:@"%d",myInt]vous donnera une représentation correctement localisée de myInt.

Barry Wark
la source
Merci Barry. La ligne NSNumber to stringValue que vous avez publiée a fonctionné pour moi, contrairement à la ligne NSString stringWithFormat.
marque le
7

La méthode d' arrondi d'olliej est incorrecte pour les nombres négatifs

  • 2,4 arrondi est 2 (la méthode d'olliej obtient ce droit)
  • −2,4 arrondi est −2 (la méthode d'olliej renvoie -1)

Voici une alternative

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

Vous pouvez bien sûr utiliser une fonction d'arrondi de math.h

Paul Dixon
la source
7

Voici un exemple de travail de NSNumberFormatter lisant la chaîne de nombres localisés (xCode 3.2.4, osX 10.6), pour économiser aux autres les heures que je viens de passer à déconner. Attention: bien qu'il puisse gérer les espaces de fin tels que "8 765,4", cela ne peut pas gérer les espaces de début et cela ne peut pas gérer les caractères de texte errants. (Chaînes d'entrée incorrectes: "8" et "8q" et "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
miker
la source
1
Que renvoie numberFromString si la chaîne n'est pas une chaîne valide?
Ben Clayton le
numberFromString: renvoie un objet NSNumber. Consultez NumberFormatting et NSNumberFormatter dans la documentation Apple. (Je ne sais pas comment les objets NSNumber encodent "pas un nombre" ou "mauvais nombre", mais je vois qu'il y a une valeur possible NSNull.)
miker
@BenClayton numberFromString renvoie une nilvaleur NSNumber*si elle ne peut pas être analysée. Je ne peux pas reproduire le problème que vous avez rencontré avec les principaux espaces blancs et les caractères de texte errants, l'OMI fonctionne correctement. " 28.5 "parse 28,5, et "gibberish28.5", "28.5gibberish"et "gibberish28.5gibberish"sont tous Unparseable; " 2 8 . 5. "est impossible à analyser mais ce n'est pas inhabituel.
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];
Samir Jwarchan
la source
3

Pour la conversion d'un nombre en chaîne, que diriez-vous d'utiliser la nouvelle syntaxe littérale (XCode> = 4.4), c'est un peu plus compact.

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

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

(Le met en boîte en tant que NSNumber et le convertit en une chaîne en utilisant la méthode de description des NSObjects )

Robert
la source
2

Pour arrondir, vous devriez probablement utiliser les fonctions C définies dans math.h.

int roundedX = round(x);

Maintenez la touche Option enfoncée et double-cliquez sur roundXcode et il vous montrera la page de manuel avec diverses fonctions pour arrondir différents types.

benzado
la source
1

C'est le moyen le plus simple que je connaisse:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
Sam Soffes
la source
1

à partir de cet exemple ici, vous pouvez voir les conversions dans les deux sens:

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);
zoltan
la source
1

convertir le texte entré dans le champ de texte en entier

double mydouble=[_myTextfield.text doubleValue];

arrondi au double le plus proche

mydouble=(round(mydouble));

arrondi à l'entier le plus proche (en ne considérant que les valeurs positives)

int myint=(int)(mydouble);

conversion de double en chaîne

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

ou

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

conversion de int en chaîne

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

ou

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
Ashish Pisey
la source
1

J'ai fini par utiliser cette macro pratique:

#define STRING(value)               [@(value) stringValue]
dimanitm
la source