Comment convertir un NSString en NSNumber
Comment puis-je convertir un NSString
contenant un nombre de n'importe quel type de données primitives (par ex. int
, float
, char
, unsigned int
, etc.)? Le problème est que je ne sais pas quel type de nombre la chaîne contiendra à l'exécution.
j'ai une idée de la façon de le faire, mais je ne suis pas sûr que cela fonctionne avec n'importe quel type, aussi non signé et valeurs de virgule flottante:
long long scannedNumber;
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanLongLong:&scannedNumber];
NSNumber *number = [NSNumber numberWithLongLong: scannedNumber];
Merci pour l'aide.
18 réponses
utiliser 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, puis myNumber
sera nil
. Si c'est un nombre valide, alors vous avez maintenant toute la bonté NSNumber
pour comprendre quel type de nombre il est réellement.
vous pouvez utiliser -[NSString integerValue]
, -[NSString floatValue]
, etc. Cependant, le correct (sensible à la localisation, etc.) la façon de faire ceci est d'utiliser -[NSNumberFormatter numberFromString:]
qui vous donnera un nombre NSN converti à partir de la locale appropriée et étant donné les paramètres du NSNumberFormatter
(y compris si elle permettra des valeurs de point flottant).
Objectif-C
(Note: cette méthode n'est pas agréable avec difference locales, mais est légèrement plus rapide qu'un NSNumberFormatter
)
NSNumber *num1 = @([@"42" intValue]);
NSNumber *num2 = @([@"42.42" floatValue]);
Swift
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)
de L'extension C'est mieux, vraiment, parce que ça va bien marcher 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
pour chaînes commençant par des entiers, p.ex., @"123"
, @"456 ft"
, @"7.89"
, etc., utiliser -[NSString integerValue]
.
donc, @([@"12.8 lbs" integerValue])
c'est comme faire [NSNumber numberWithInteger:12]
.
vous pouvez aussi faire ceci:
NSNumber *number = @([dictionary[@"id"] intValue]]);
amusez-vous bien!
si vous savez que vous recevez des entiers, vous pouvez utiliser:
NSString* val = @"12";
[NSNumber numberWithInt:[val intValue]];
voici un échantillon de travail de NSNumberFormatter lecture localisée nombre NSString (Xcode 3.2.4, osX 10.6), Pour sauver les autres les heures que je viens de passer à jouer. Attention: alors qu'il peut traiter les blancs traînants ("8.765.4 " fonctionne), cela ne peut pas gérer l'espace blanc menant et cela ne peut pas gérer les caractères de texte errants. (Mauvaise saisie de chaînes de caractères: "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
je voulais convertir une corde en double. Cette réponse ci-dessus n'a pas vraiment fonctionné pour moi. Mais cela a fait: Comment faire des conversions de chaîne dans L'objectif-C?
Tout ce que j'ai fait était:
double myDouble = [myString doubleValue];
Merci À Tous! Je suis un feedback combiné et finalement j'arrive à passer de l'entrée de texte ( chaîne ) à L'entier. Plus il pourrait me dire si l'entrée est entier :)
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];
je pense que NSDecimalNumber va le faire:
exemple:
NSNumber *theNumber = [NSDecimalNumber decimalNumberWithString:[stringVariable text]]];
NSDecimalNumber est une sous-classe de NSNumber, donc moulage implicite autorisé.
Qu'en est-il de la norme c atoi
?
int num = atoi([scannedNumber cStringUsingEncoding:NSUTF8StringEncoding]);
pensez-vous qu'il y ait des réserves?
vous pouvez simplement utiliser [string intValue]
ou [string floatValue]
ou [string doubleValue]
etc
vous pouvez également utiliser NSNumberFormatter
classe:
vous pouvez aussi faire comme CE code 8.3.3 iOS 10.3 support
[NSNumber numberWithInt:[@"put your string here" intValue]]
NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"];
NSLog(@"My Number : %@",myNumber);
je sais que c'est très tard mais le code ci-dessous fonctionne pour moi.
essayez ce code
NSNumber *number = @([dictionary[@"keyValue"] intValue]]);
Cela peut vous aider. Merci
Essayez cette
NSNumber *yourNumber = [NSNumber numberWithLongLong:[yourString longLongValue]];
Note-j'ai utilisé la valeur à long terme selon mon exigence. Vous pouvez également utiliser integerValue, longValue, ou tout autre format selon vos besoins.
extension String {
var numberValue:NSNumber? {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter.number(from: self)
}
}
let someFloat = "12.34".numberValue