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.

547
demandé sur brynbodayle 2009-09-19 19:48:29

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.

1204
répondu Dave DeLong 2015-01-18 16:01:30

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

177
répondu Barry Wark 2009-09-19 16:24:02

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
128
répondu Kevin R 2018-02-08 19:49:57

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

87
répondu ma11hew28 2014-04-25 16:59:51

vous pouvez aussi faire ceci:

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

amusez-vous bien!

50
répondu MacMark 2013-06-05 13:13:59

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

NSString* val = @"12";
[NSNumber numberWithInt:[val intValue]];
27
répondu Ad1905 2012-04-10 00:35:29

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
12
répondu miker 2010-11-01 20:05:53

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];
6
répondu Anthony 2017-05-23 12:18:32

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];
6
répondu DNA App Lab 2016-07-30 15:43:56

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

4
répondu JeanNicolas 2013-07-20 08:57:22

Qu'en est-il de la norme c atoi ?

int num = atoi([scannedNumber cStringUsingEncoding:NSUTF8StringEncoding]);

pensez-vous qu'il y ait des réserves?

2
répondu martin 2012-07-27 12:55:50

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

vous pouvez également utiliser NSNumberFormatter classe:

2
répondu user1479883 2016-03-23 18:42:55

vous pouvez aussi faire comme CE code 8.3.3 iOS 10.3 support

[NSNumber numberWithInt:[@"put your string here" intValue]]
2
répondu Parv Bhasker 2017-07-07 06:33:49
NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"];
NSLog(@"My Number : %@",myNumber);
1
répondu Sandip Patel - SM 2013-08-08 07:18:32

ouvré en Swift 3

NSDecimalNumber(string: "Your string") 
0
répondu user431791 2016-09-23 08:18:39

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
répondu Ashu 2017-05-27 07:27:57

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.

0
répondu Rizwan Ahmed 2017-11-09 08:10:51
extension String {

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

let someFloat = "12.34".numberValue
-1
répondu Ankit garg 2017-10-12 18:55:02