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?
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?
Réponses:
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];
[[NSNumber numberWithInt:myInt] stringValue]
Pour vraiment convertir correctement une chaîne en nombre, vous devez utiliser une instance de NSNumberFormatter
configuré 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 COMMA
est 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 NSNumberFormatter
pour 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.
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]
stringValue
sur un NSNumber
appel 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
.
La méthode d' arrondi d'olliej est incorrecte pour les nombres négatifs
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
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
nil
valeur 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.
// 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];
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 )
C'est le moyen le plus simple que je connaisse:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
à 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);
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];