Question Comment convertir un NSString en un NSNumber


Comment puis-je convertir un NSString contenant un nombre de n'importe quel type de données primitif (par ex. int, float, char, unsigned int, etc.)? Le problème est, je ne sais pas quel type de numéro la chaîne contiendra à l'exécution.

J'ai une idée de comment le faire, mais je ne suis pas sûr que cela fonctionne avec n'importe quel type, aussi des valeurs non signées et à virgule flottante:

long long scannedNumber;
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanLongLong:&scannedNumber]; 
NSNumber *number = [NSNumber numberWithLongLong: scannedNumber];

Merci pour l'aide.


545
2017-09-19 15:48


origine


Réponses:


Utilisez un NSNumberFormatter:

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *myNumber = [f numberFromString:@"42"];

Si la chaîne n'est pas un nombre valide, alors myNumber sera nil. Si c'est un nombre valide, alors vous avez maintenant tous les NSNumber bonté de comprendre quel genre de nombre il est réellement.


1203
2017-09-19 16:21



Vous pouvez utiliser -[NSString integerValue], -[NSString floatValue], etc. Cependant, la façon correcte (sensible aux paramètres régionaux, etc.) de le faire est d'utiliser -[NSNumberFormatter numberFromString:] qui vous donnera un NSNumber converti à partir de la locale appropriée et compte tenu des paramètres de la NSNumberFormatter (y compris si cela permettra des valeurs à virgule flottante).


177
2017-09-19 16:18



Objectif c

(Note: cette méthode ne joue pas bien avec les différences locales, mais est légèrement plus rapide qu'un NSNumberFormatter)

NSNumber *num1 = @([@"42" intValue]);
NSNumber *num2 = @([@"42.42" floatValue]);

Rapide

Manière simple mais sale

// Swift 1.2
if let intValue = "42".toInt() {
    let number1 = NSNumber(integer:intValue)
}

// Swift 2.0
let number2 = Int("42')

// Swift 3.0
NSDecimalNumber(string: "42.42") 

// Using NSNumber
let number3 = NSNumber(float:("42.42" as NSString).floatValue)

La voie d'extension C'est mieux, vraiment, parce que ça va bien jouer avec les locales et les décimales.

extension String {

    var numberValue:NSNumber? {
        let formatter = NSNumberFormatter()
        formatter.numberStyle = .DecimalStyle
        return formatter.number(from: self)
    }
}

Maintenant vous pouvez simplement faire:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue

127
2017-12-09 13:25



Pour les chaînes commençant par des entiers, par exemple, @"123", @"456 ft", @"7.89", etc., utilisez -[NSString integerValue].

Alors, @([@"12.8 lbs" integerValue]) est comme faire [NSNumber numberWithInteger:12].


87
2017-09-29 13:04



Vous pouvez aussi faire ceci:

NSNumber *number = @([dictionary[@"id"] intValue]]);

S'amuser!


50
2018-06-05 13:13



Si vous savez que vous recevez des entiers, vous pouvez utiliser:

NSString* val = @"12";
[NSNumber numberWithInt:[val intValue]];

27
2018-04-10 00:35



Voici un exemple fonctionnel de NSNumberFormatter lisant le nombre localisé NSString (xCode 3.2.4, osX 10.6), pour sauver les autres heures que je viens de passer à déconner. Attention: bien qu'il puisse gérer les espaces de fin ("8,765.4" fonctionne), cela ne peut pas gérer les espaces blancs en tête et cela ne peut pas gérer les caractères de texte. (Mauvaises chaînes d'entrée: "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

12
2017-10-25 20:33



Je voulais convertir une chaîne en double. Cette réponse ci-dessus n'a pas vraiment fonctionné pour moi. Mais cela a fait: Comment faire des conversions de chaînes dans Objective-C?

Tout ce que j'ai fait à peu près était:

double myDouble = [myString doubleValue];

6
2017-09-14 14:39



Merci a tous! Je suis combiné des commentaires et enfin parvenir à convertir de la saisie de texte (chaîne) en entier. De plus, il pourrait me dire si l'entrée est entière :)

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:thresholdInput.text];

int minThreshold = [myNumber intValue]; 

NSLog(@"Setting for minThreshold %i", minThreshold);

if ((int)minThreshold < 1 )
{
    NSLog(@"Not a number");
}
else
{
    NSLog(@"Setting for integer minThreshold %i", minThreshold);
}
[f release];

6
2018-03-05 13:17