Cómo convertir un NSString en un NSNumber
¿ Cómo puedo convertir un NSString
contenido que contenga un número de cualquier tipo de datos primitivo (por ejemplo , int
, float
, etc.)? El problema es que no sé qué tipo de número contendrá la cadena en tiempo de ejecución.char
unsigned int
Tengo una idea de cómo hacerlo, pero no estoy seguro de si funciona con algún tipo, también con valores sin signo y de punto flotante:
long long scannedNumber;
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanLongLong:&scannedNumber];
NSNumber *number = [NSNumber numberWithLongLong: scannedNumber];
Gracias por la ayuda.
Utilice un NSNumberFormatter
:
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *myNumber = [f numberFromString:@"42"];
Si la cadena no es un número válido, entonces myNumber
será nil
. Si es un número válido, entonces ahora tienes toda la NSNumber
bondad para descubrir qué tipo de número es en realidad.
Puede usar -[NSString integerValue]
, -[NSString floatValue]
, etc. Sin embargo, la forma correcta (sensible a la configuración regional, etc.) de hacer esto es usar -[NSNumberFormatter numberFromString:]
el cual le dará un NSNumber convertido desde la configuración regional apropiada y dada la configuración de NSNumberFormatter
(incluido si permitirá flotante valores de puntos).
C objetivo
(Nota: este método no funciona bien con diferentes configuraciones regionales, pero es un poco más rápido que NSNumberFormatter
)
NSNumber *num1 = @([@"42" intValue]);
NSNumber *num2 = @([@"42.42" floatValue]);
Rápido
Manera simple pero sucia
// 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)
La forma de extensión Esto es mejor, realmente, porque funcionará bien con configuraciones regionales y decimales.
extension String {
var numberValue:NSNumber? {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter.number(from: self)
}
}
Ahora puedes simplemente hacer:
let someFloat = "42.42".numberValue
let someInt = "42".numberValue
Para cadenas que comienzan con números enteros, por ejemplo, @"123"
, @"456 ft"
, @"7.89"
etc., utilice -[NSString integerValue]
.
Entonces, @([@"12.8 lbs" integerValue])
es como hacer [NSNumber numberWithInteger:12]
.