web-dev-qa-db-fra.com

Comment convertir un NSString en un NSNumber

Comment convertir un NSStringcontenant un certain nombre de types de données primitifs (par exemple, intname__, floatname__, charname__, 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.

560
Enyra

Utilisez un NSNumberFormattername__:

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

Si la chaîne n'est pas un nombre valide, alors myNumbersera nilname__. S'il s'agit d'un nombre valide, il vous reste alors tout le bravour NSNumberpour déterminer le type de ce numéro.

1228
Dave DeLong

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).

178
Barry Wark

Objectif c

(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]);

Rapide

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
135
Kevin R

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

86
ma11hew28

Vous pouvez aussi faire ceci:

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

S'amuser!

49
MacMark

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

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

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

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];
6
Anthony

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];
5
DNA App Lab

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.

4
JeanNicolas

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?

2
martin

Vous pouvez simplement utiliser [string intValue] ou [string floatValue] ou [string doubleValue] etc

Vous pouvez également utiliser NSNumberFormatter class:

2
user1479883

vous pouvez aussi faire comme ce code 8.3.3 support ios 10.3

[NSNumber numberWithInt:[@"put your string here" intValue]]
2
Parv Bhasker
NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"];
NSLog(@"My Number : %@",myNumber);
1
Sandip Patel - SM

Travaillé dans Swift

NSDecimalNumber(string: "Your string") 
0
user431791

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

0
Ashu

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.

0
Rizwan Ahmed