Cómo convertir un NSString en un NSNumber

Resuelto Enyra asked hace 14 años • 18 respuestas

¿ Cómo puedo convertir un NSStringcontenido 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.charunsigned 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.

Enyra avatar Sep 19 '09 22:09 Enyra
Aceptado

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 myNumberserá nil. Si es un número válido, entonces ahora tienes toda la NSNumberbondad para descubrir qué tipo de número es en realidad.

Dave DeLong avatar Sep 19 '2009 16:09 Dave DeLong

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

Barry Wark avatar Sep 19 '2009 16:09 Barry Wark

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
Kevin R avatar Dec 09 '2013 13:12 Kevin R

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

ma11hew28 avatar Sep 29 '2010 13:09 ma11hew28