Comment convertir un NSString
contenant un certain nombre de types de données primitifs (par exemple, int
name__, float
name__, char
name__, unsigned int
, etc.)? Le problème est que je ne sais pas quel type de numéro la chaîne contiendra au moment de 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, y compris avec les 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.
Utilisez un NSNumberFormatter
name__:
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
name__. S'il s'agit d'un nombre valide, il vous reste alors tout le bravour NSNumber
pour déterminer le type de ce numéro.
Vous pouvez utiliser -[NSString integerValue]
, -[NSString floatValue]
, etc. Cependant, la manière correcte de le faire (en fonction des paramètres régionaux, etc.) consiste à utiliser -[NSNumberFormatter numberFromString:]
qui vous donnera un NSNumber converti à partir de la locale appropriée et en fonction des paramètres du NSNumberFormatter
(y compris cela autorisera les valeurs en virgule flottante).
(Remarque: cette méthode ne joue pas avec Nice avec des paramètres régionaux différents, mais est légèrement plus rapide qu'un NSNumberFormatter
)
NSNumber *num1 = @([@"42" intValue]);
NSNumber *num2 = @([@"42.42" floatValue]);
Façon 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)
The extension-way 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
Pour les chaînes commençant par des entiers, par exemple, @"123"
, @"456 ft"
, @"7.89"
, etc., utilisez -[NSString integerValue]
.
Donc, @([@"12.8 lbs" integerValue])
est comme si vous faisiez [NSNumber numberWithInteger:12]
.
Vous pouvez aussi faire ceci:
NSNumber *number = @([dictionary[@"id"] intValue]]);
S'amuser!
Si vous savez que vous recevez des entiers, vous pouvez utiliser:
NSString* val = @"12";
[NSNumber numberWithInt:[val intValue]];
Voici un exemple de travail de NSNumberFormatter qui lit le numéro localisé NSString (xCode 3.2.4, osX 10.6), afin d’économiser pour les autres les heures que je viens de perdre. Attention: bien qu'il puisse gérer les blancs de fin ("8 765,4" fonctionne), cela ne peut pas gérer les espaces et les espaces, mais pas 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
Je voulais convertir une chaîne en double. Cette réponse ci-dessus n'a pas 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];
Merci a tous! Je combine les commentaires et parviens enfin à convertir une entrée de texte (chaîne) en un entier. De plus, il pourrait me dire si l'entrée est un 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 le fera:
Exemple:
NSNumber *theNumber = [NSDecimalNumber decimalNumberWithString:[stringVariable text]]];
NSDecimalNumber est une sous-classe de NSNumber, donc la conversion implicite est autorisée.
Qu'en est-il du nom standard atoi
de C?
int num = atoi([scannedNumber cStringUsingEncoding:NSUTF8StringEncoding]);
Pensez-vous qu'il y a des mises en garde?
Vous pouvez simplement utiliser [string intValue]
ou [string floatValue]
ou [string doubleValue]
etc
Vous pouvez également utiliser NSNumberFormatter
class:
vous pouvez aussi faire comme ce code 8.3.3 support ios 10.3
[NSNumber numberWithInt:[@"put your string here" intValue]]
NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"];
NSLog(@"My Number : %@",myNumber);
Travaillé dans Swift
NSDecimalNumber(string: "Your string")
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
Essaye ça
NSNumber *yourNumber = [NSNumber numberWithLongLong:[yourString longLongValue]];
Remarque - J'ai utilisé longLongValue selon mes besoins. Vous pouvez également utiliser integerValue, longValue ou tout autre format en fonction de vos besoins.