Je veux convertir une chaîne en double et après avoir fait quelques calculs, reconvertissez-la en chaîne.
Comment est-ce que je fais ceci dans Objective-C?
Est-il possible d'arrondir aussi un double au nombre entier le plus proche?
Vous pouvez convertir un NSString en double avec
double myDouble = [myString doubleValue];
Arrondir 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 s'il existe un moyen plus simple de reconvertir en chaîne que
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
Pour convertir correctement une chaîne en un nombre correctement, vous devez utiliser une instance de NSNumberFormatter
configurée pour les paramètres régionaux à partir desquels vous lisez la chaîne.
Des paramètres régionaux différents formateront les nombres Par exemple, dans certaines régions du monde, COMMA
est utilisé comme séparateur décimal tandis que dans d’autres, il est PERIOD
- et le séparateur de milliers (s’il est utilisé) est inversé. Sauf quand c'est un espace. Ou pas présent du tout.
Cela dépend vraiment de la provenance de l'entrée. Le plus sûr est de configurer un NSNumberFormatter
pour le format de votre entrée et d'utiliser -[NSFormatter numberFromString:]
pour obtenir un NSNumber
. Si vous souhaitez gérer les erreurs de conversion, vous pouvez utiliser plutôt -[NSFormatter getObjectValue:forString:range:error:]
.
En ajoutant à la réponse de olliej, vous pouvez convertir un int en une chaîne avec NSNumber
'stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
sur un NSNumber
invoque descriptionWithLocale:nil
, vous donnant une représentation localisée sous forme de chaîne de valeur. Je ne sais pas si [NSString stringWithFormat:@"%d",myInt]
vous donnera une représentation correctement localisée de myInt
.
Voici un exemple de travail de NSNumberFormatter en train de lire un numéro localisé String (xCode 3.2.4, osX 10.6), afin de préserver les heures que je viens de perdre. Attention: bien qu'il puisse gérer les espaces de fin, tels que "8 765,4", il ne peut pas gérer les espaces et les espaces ainsi que les caractères de texte égarés. (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
la méthode arrondi d'olliej est fausse 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
// 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 convertir un nombre en chaîne, pourquoi ne pas 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 comme NSNumber et le convertit en chaîne à l'aide de la méthode méthode de description de NSObjects )
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 round
dans Xcode pour afficher la page de manuel contenant diverses fonctions permettant d’arrondir différents types.
J'ai fini par utiliser cette macro pratique:
#define STRING(value) [@(value) stringValue]
à 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 saisi dans textfield en entier
double mydouble=[_myTextfield.text doubleValue];
arrondir au double le plus proche
mydouble=(round(mydouble));
arrondi à l'entier le plus proche (en considérant uniquement 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];
C'est le moyen le plus simple que je connaisse:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;