web-dev-qa-db-fra.com

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

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?

146
rksprst

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];
230
olliej

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:].

70
Chris Hanson

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.

32
Barry Wark

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
7
miker

la méthode arrondi d'olliej est fausse pour les nombres négatifs

  • 2,4 arrondi est 2 (la méthode de olliej obtient ce droit)
  • −2.4 arrondi est −2 (la méthode de 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

7
Paul Dixon
// 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
Samir Jwarchan

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 )

2
Robert

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.

2
benzado

J'ai fini par utiliser cette macro pratique:

#define STRING(value)               [@(value) stringValue]
1
dimanitm

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

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];
1
Ashish Pisey

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

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