2010-07-21 10 views
12

acepto NSString comoConvertir NSString al doble para los cálculos y luego de vuelta a imprimir en NSString

NSString *value = [valuelist objectAtIndex:valuerow]; 
NSString *value2 = [valuelist2 objectAtIndex:valuerow2]; 

de UIPickerView. Quiero

double *cal = value + (value2 * 8) + 3; 


NSString *message =[[NSString alloc] initWithFormat:@"%@",cal]; 

yo debería ser capaz de obtener la cadena en el mensaje después de hacer los cálculos en ella .. Por favor ayuda Mi programa está fallando

Respuesta

35
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3; 
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal]; 
+0

Thankyou Guys! Funcionó ! –

+1

Ahora que es completamente subjetivo –

+0

Miré a mi alrededor y hasta ahora% f y% g parecen ser idénticos según la mayoría de las referencias. ¿En qué se diferencian? – jamone

1
 
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3; 
NSString *message =[[NSString alloc] initWithFormat:@"%g",cal]; 

// do work with message 

[message release]; 
2

No deberías t convierte entre dobles y cadenas todo el tiempo, ya que tiende a perder precisión (en general, tienes que ser muy cuidadoso si no quieres perder precisión).

Por ejemplo, nextafter(1.0,2.0) devuelve el doble más pequeño más grande que 1 (exactamente 1.0000000000000002220446049250313080847263336181640625, pero estamos contentos con 1.0000000000000002). Formatear con "% g" simplemente devuelve "1".

Esperamos que NSNumber haga lo correcto, pero [[NSNumber numberWithDouble:nextafter(1,2)] stringValue] también devuelve "1". De acuerdo con los documentos, -[NSNumber stringValue] llama al [self descriptionWithLocale:nil] y lo formatea con "% 0.16g". Eso no es suficiente. Sin embargo, obtenemos la respuesta correcta formateando con "% .17g". Creo que "% .17g" es suficiente siempre que los dobles sean IEEE 754 de 64 bits dobles y las bibliotecas funcionen correctamente, pero no hay garantía.

Al final del día, no hay garantía de que [[NSString stringWithFormat:@"%.17g",n] doubleValue] == n.

+0

Gracias por eso, pero solo necesitaba hasta 2 decimales lugares ... es decir: 12.50 –

1

Publicación de una nueva respuesta ya que la aceptación de un sólo string => doble:

double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3; 
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal]; 

Para ir de doble cadena =>, utilice

double cost = [string doubleValue]; 
+0

¿por qué el puntero? Debe ser double cost = [string doubleValue]; –

+0

buen punto. en un nivel meta ... ¿por qué el comentario? solo edite la publicación? : D – pfrank

+0

Tienes razón :-) Editado –