objective c - framework - ¿Cómo hacer conversiones de cadenas en Objective-C?
cocoa touch framework (12)
Añadiendo a la respuesta de Olliej, puede convertir de un int a una cadena con NSNumber
de stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
en un NSNumber
invoca descriptionWithLocale:nil
, que le proporciona una representación de cadena localizada de valor. No estoy seguro de si [NSString stringWithFormat:@"%d",myInt]
le dará una representación adecuadamente localizada de myInt
.
Quiero convertir una cadena en una doble y después de hacer algunas operaciones matemáticas, convertirla a una cadena.
¿Cómo hago esto en Objective-C?
¿Hay alguna forma de redondear un doble al entero más cercano también?
Aquí hay una muestra de trabajo de NSNumberFormatter leyendo el número traducido String (xCode 3.2.4, osX 10.6), para ahorrar a otros las horas que acabo de pasar haciendo el tonto. Tenga cuidado: aunque puede manejar espacios en blanco posteriores como "8,765.4", no puede manejar 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
El método de rounding de Olliej es incorrecto para los números negativos
- 2.4 redondeado es 2 (el método de Olliej lo entiende 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
Esta es la forma más fácil que conozco:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
Para convertir realmente de una cadena a un número correctamente, debe usar una instancia de NSNumberFormatter
configurada 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, COMMA
se usa como un separador decimal, mientras que en otros es PERIOD
, y el separador de miles (cuando se usa) se invierte. Excepto cuando es un espacio. O no está presente en absoluto.
Realmente depende de la procedencia de la entrada. Lo más seguro es configurar un NSNumberFormatter
para la forma en que se formatea su entrada y usar -[NSFormatter numberFromString:]
para obtener un NSNumber
de él. Si desea manejar los errores de conversión, puede usar -[NSFormatter getObjectValue:forString:range:error:]
lugar.
Para la conversión de un número a una cadena, ¿qué hay de usar la nueva sintaxis de los literales (XCode> = 4.4), es un poco más compacto.
int myInt = (int)round( [@"1.6" floatValue] );
NSString* myString = [@(myInt) description];
(Lo NSNumber como un NSNumber y lo convierte en una cadena usando el método de descripción de NSObjects )
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 en round
en Xcode y le mostrará la página man con varias funciones para redondear diferentes tipos.
Puede convertir un NSString en un doble con
double myDouble = [myString doubleValue];
Redondeando a la int más cercana 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 para convertir de nuevo en una cadena que
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
Terminé usando esta útil macro:
#define STRING(value) [@(value) stringValue]
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 cadena
myLabel.text=[NSString stringWithFormat:@"%d",myint];
o
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
de este ejemplo aquí, 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);
// 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];