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?
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?
Respuestas:
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];
[[NSNumber numberWithInt:myInt] stringValue]
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, COMMA
se 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 NSNumberFormatter
forma 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.
Agregando a la respuesta de olliej, puede convertir de un int a una cadena con NSNumber
's stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
en una NSNumber
invocació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
.
El método de redondeo de olliej es incorrecto para números negativos
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
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
nil
valor 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.
// 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];
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 )
Esta es la forma más fácil que conozco:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
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);
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];