Pregunta Cómo convertir un NSString en un NSNumber


¿Cómo puedo convertir un NSString que contiene una cantidad de cualquier tipo de datos primitivos (p. int, float, char, unsigned int, etc.)? El problema es que no sé qué tipo de número contendrá la cadena en tiempo de ejecución.

Tengo una idea de cómo hacerlo, pero no estoy seguro si esto funciona con cualquier tipo, también valores de punto flotante y sin signo:

long long scannedNumber;
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanLongLong:&scannedNumber]; 
NSNumber *number = [NSNumber numberWithLongLong: scannedNumber];

Gracias por la ayuda.


545
2017-09-19 15:48


origen


Respuestas:


Use una 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 estarán nil. Si es un número válido, entonces ahora tiene todos los NSNumber bondad para descubrir qué tipo de número es en realidad.


1203
2017-09-19 16:21



Puedes 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:] que le dará un NSNumber convertido a partir de la configuración regional apropiada y dada la configuración de la NSNumberFormatter (incluyendo si permitirá valores de coma flotante).


177
2017-09-19 16:18



C objetivo

(Nota: este método no funciona bien con las configuraciones regionales de diferencia, pero es ligeramente más rápido que un 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 extensión-camino Esto es mejor, en realidad, porque jugará muy bien con locales y decimales.

extension String {

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

Ahora puedes simplemente hacer:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue

127
2017-12-09 13:25



Para cadenas que comienzan con enteros, por ejemplo, @"123", @"456 ft", @"7.89", etc., uso -[NSString integerValue].

Asi que, @([@"12.8 lbs" integerValue]) es como hacer [NSNumber numberWithInteger:12].


87
2017-09-29 13:04



También puedes hacer esto:

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

¡Que te diviertas!


50
2018-06-05 13:13



Si sabe que recibe números enteros, podría usar:

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

27
2018-04-10 00:35



Aquí hay una muestra de trabajo de NSNumberFormatter leyendo el número localizado NSString (xCode 3.2.4, osX 10.6), para ahorrarles a otros las horas que acabo de pasar haciendo el tonto. Cuidado: si bien puede manejar espacios en blanco al final ("8,765.4" funciona), no puede manejar el espacio en blanco inicial y esto no puede manejar caracteres de texto extraviados. (Malos hilos de entrada: "8" y "8q" y "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
2017-10-25 20:33



Yo quería convertir una cadena a un doble. Esta respuesta anterior no funcionó para mí. Pero esto hizo: ¿Cómo hacer conversiones de cadenas en Objective-C?

Todo lo que hice fue:

double myDouble = [myString doubleValue];

6
2017-09-14 14:39



¡Gracias a todos! Soy un feedback combinado y finalmente logro convertir de entrada de texto (cadena) a Entero. Además, podría decirme si la entrada es entera :)

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
2018-03-05 13:17



Creo que NSDecimalNumber lo hará:

Ejemplo:

NSNumber *theNumber = [NSDecimalNumber decimalNumberWithString:[stringVariable text]]];

NSDecimalNumber es una subclase de NSNumber, por lo que se permite la conversión implícita.


4
2017-07-20 08:57



¿Qué pasa con el estándar de C? atoi?

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

¿Crees que hay alguna advertencia?


2
2017-07-27 12:55