How to convert an NSString into an NSNumber
Use an NSNumberFormatter
:
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];f.numberStyle = NSNumberFormatterDecimalStyle;NSNumber *myNumber = [f numberFromString:@"42"];
If the string is not a valid number, then myNumber
will be nil
. If it is a valid number, then you now have all of the NSNumber
goodness to figure out what kind of number it actually is.
You can use -[NSString integerValue]
, -[NSString floatValue]
, etc. However, the correct (locale-sensitive, etc.) way to do this is to use -[NSNumberFormatter numberFromString:]
which will give you an NSNumber converted from the appropriate locale and given the settings of the NSNumberFormatter
(including whether it will allow floating point values).
Objective-C
(Note: this method doesn't play nice with difference locales, but is slightly faster than a NSNumberFormatter
)
NSNumber *num1 = @([@"42" intValue]);NSNumber *num2 = @([@"42.42" floatValue]);
Swift
Simple but dirty way
// Swift 1.2if let intValue = "42".toInt() { let number1 = NSNumber(integer:intValue)}// Swift 2.0let number2 = Int("42')// Swift 3.0NSDecimalNumber(string: "42.42") // Using NSNumberlet number3 = NSNumber(float:("42.42" as NSString).floatValue)
The extension-wayThis is better, really, because it'll play nicely with locales and decimals.
extension String { var numberValue:NSNumber? { let formatter = NumberFormatter() formatter.numberStyle = .decimal return formatter.number(from: self) }}
Now you can simply do:
let someFloat = "42.42".numberValuelet someInt = "42".numberValue