¿Cómo hacer conversiones de cadenas en Objective-C?

145

Quiero convertir una cadena en un doble y, después de hacer algunos cálculos matemáticos, volver a convertirla en una cadena.

¿Cómo hago esto en Objective-C?

¿Hay alguna manera de redondear un doble al entero más cercano también?

rksprst
fuente
Además de la respuesta de Chris Hanson, puede encontrar más información sobre formateadores de números, su comportamiento y cadenas de formato, de NSNumberFormatter en Mac OS X 10.4 en la Guía de programación de formato de datos para Cocoa .
mmalc
Otra fuente de información que podría serle útil es este artículo sobre NSNumberFormatter: iphonesdkarticles.com/2008/11/…
jpm
Creo que la documentación oficial es bastante buena ...

Respuestas:

231

Puede convertir un NSString en un doble con

double myDouble = [myString doubleValue];

El redondeo al int más cercano se puede hacer como

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Sinceramente, no estoy seguro de si hay una forma más simplificada de convertir de nuevo en una cadena que

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
olliej
fuente
13
No necesariamente desea hacer esto, porque las configuraciones regionales diferentes dan formato a los números de manera diferente. Algunos escribirán "1000" por mil, mientras que otros escribirán "1,000" y otros "1,000", ¿cuál obtiene de [NSString doubleValue]?
Chris Hanson
9
Double es un tipo de datos numéricos; no contiene ningún formato. Llamar a [NSString doubleValue] devolvería 1000 porque es solo un número.
Andy
12
Y un NSString no puede contener un número, solo una representación de un número. Esa representación puede estar en cualquiera de una variedad de formatos que difieren según la localidad.
Chris Hanson
55
es posible que desee integrar la respuesta de @Barry Wark en la suya,[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark
1
¿Qué sucede si el valor de la cadena no es una cadena doble válida, entonces doubleValue devolverá 0.0? Me parece que la solución que sugiere el uso de NSNumberFormatter es mejor porque si la cadena no representa una cadena doble válida, entonces se devuelve nil.
Kaydell
70

Para convertir realmente de una cadena a un número correctamente, debe usar una instancia de NSNumberFormatter configurado para la configuración regional desde la que está leyendo la cadena.

Las diferentes configuraciones regionales formatearán los números de manera diferente. Por ejemplo, en algunas partes del mundo, COMMAse usa como separador decimal, mientras que en otras esPERIOD , y el separador de miles (cuando se usa) se invierte. Excepto cuando es un espacio. O no presente en absoluto.

Realmente depende de la procedencia de la entrada. Lo más seguro es configurar una NSNumberFormatterforma de entrada y utilizarla -[NSFormatter numberFromString:]para obtenerla NSNumber. Si desea manejar los errores de conversión, puede usarlos -[NSFormatter getObjectValue:forString:range:error:]en su lugar.

Chris Hanson
fuente
2
O puede usar un escáner localizado, por ejemplo uno creado con [NSScanner localizedScannerWithString:], y luego [scanner scanDouble: & aDouble] escaneará en un doble basado en la localización actual del usuario.
dreamlax
32

Agregando a la respuesta de olliej, puede convertir de un int a una cadena con NSNumber's stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValueen una NSNumberinvocación descriptionWithLocale:nil, dándole una representación de valor de cadena localizada. No estoy seguro de si [NSString stringWithFormat:@"%d",myInt]le dará una representación adecuadamente localizada de myInt.

Barry Wark
fuente
Gracias barry La línea NSNumber to stringValue que publicó funcionó para mí, mientras que la cadena NSString stringWithFormat no lo hizo.
marca el
7

El método de redondeo de olliej es incorrecto para números negativos

  • 2.4 redondeado es 2 (el método de olliej lo hace bien)
  • −2.4 redondeado es −2 (el método de olliej devuelve -1)

Aquí hay una alternativa

  int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Por supuesto, podría usar una función de redondeo de math.h

Paul Dixon
fuente
7

Aquí hay una muestra funcional de NSNumberFormatter que lee String de números localizados (xCode 3.2.4, osX 10.6), para ahorrar a los demás las horas que acabo de perder. Cuidado: aunque puede manejar espacios en blanco finales como "8,765.4", esto no puede manejar espacios en blanco iniciales y esto no puede manejar caracteres de texto extraviados. (Cadenas de entrada incorrectas: "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
miker
fuente
1
¿Qué devuelve numberFromString si la cadena no es una cadena válida?
Ben Clayton
numberFromString: devuelve un objeto NSNumber. Consulte NumberFormatting y NSNumberFormatter en documentos de Apple. (No estoy seguro de cómo los objetos NSNumber codifican "no un número" o "número incorrecto", pero veo que hay un posible valor NSNull.)
miker
@BenClayton numberFromString devuelve un nilvalor NSNumber*si no se puede analizar. No puedo reproducir ese problema que tuvo con los espacios en blanco iniciales y los caracteres de texto extra, IMO está funcionando correctamente. " 28.5 "analiza como 28.5, y "gibberish28.5", "28.5gibberish"y "gibberish28.5gibberish"son todos unparseable; " 2 8 . 5. "no se puede analizar, pero eso no es inusual.
jrh
3
// Converting String in to Double

double doubleValue = [yourString doubleValue];

// Converting Double in to String
NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
// .20f takes the value up to 20 position after decimal

// Converting double to int

int intValue = (int) doubleValue;
or
int intValue = [yourString intValue];
Samir Jwarchan
fuente
3

Para la conversión de un número a una cadena, ¿qué tal el uso de la nueva sintaxis de literales (XCode> = 4.4), es un poco más compacto.

int myInt = (int)round( [@"1.6" floatValue] );

NSString* myString = [@(myInt) description];

(Lo encajona como un NSNumber y lo convierte en una cadena usando el método de descripción de NSObjects )

Robert
fuente
2

Para redondear, probablemente debería usar las funciones C definidas en math.h.

int roundedX = round(x);

Mantenga presionada la tecla Opción y haga doble clic rounden Xcode y le mostrará la página de manual con varias funciones para redondear diferentes tipos.

benzado
fuente
1

Esta es la forma más fácil que conozco:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
Sam Soffes
fuente
1

a partir de este ejemplo, puede ver las conversiones en ambos sentidos:

NSString *str=@"5678901234567890";

long long verylong;
NSRange range;
range.length = 15;
range.location = 0;

[[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];

NSLog(@"long long value %lld",verylong);
zoltan
fuente
1

convertir el texto ingresado en el campo de texto a entero

double mydouble=[_myTextfield.text doubleValue];

redondeando al doble más cercano

mydouble=(round(mydouble));

redondeando al int más cercano (considerando solo valores positivos)

int myint=(int)(mydouble);

convirtiendo de doble a cadena

myLabel.text=[NSString stringWithFormat:@"%f",mydouble];

o

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

convirtiendo de int a string

myLabel.text=[NSString stringWithFormat:@"%d",myint];

o

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
Ashish Pisey
fuente
1

Terminé usando esta práctica macro:

#define STRING(value)               [@(value) stringValue]
dimanitm
fuente