with - double two decimals swift
Limite un doble a dos decimales (5)
Estoy bastante seguro de que [[NSNumber numberWithFloat: f] stringValue] hace exactamente lo que quiere.
¿Cómo logro la siguiente conversión de doble a una cadena?
1.4324 => "1.43"
9.4000 => "9.4"
43.000 => "43"
es decir, quiero redondear a las cifras decimales, pero no quiero ceros al final, es decir, no quiero
9.4 => "9.40" (wrong)
43.000 => "43.00" (wrong)
Entonces, este código que tengo ahora no funciona, ya que muestra ceros excesivos:
[NSString stringWithFormat: @"%.2f", total]
Use NSNumberFormatter . Consulte el capítulo de la Guía de programación de formato de datos sobre formateadores numéricos .
La forma más fácil es probablemente tirar la tuya. He tenido que hacer esto en C antes, ya que no hay forma de obtener el comportamiento que desea con el formato printf
.
No parece ser mucho más fácil tampoco en Objective-C. Yo probaría esto:
NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
while ([ftotal hasSuffix:@"0"]) {
ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
if ([ftotal hasSuffix:@"."]) {
ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
o esta variante (posiblemente más rápida):
NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
if ([ftotal hasSuffix:@".00"]) {
ftotal = [ftotal subStringToIndex [ftotal length]-3];
} else {
if ([ftotal hasSuffix:@"0"]) {
ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
}
El stringWithFormat
garantiza que siempre habrá un ".nn"
al final (donde n
es un carácter de dígito). El while
y if
simplemente quita los ceros finales y el decimal al final si se trata de un número entero.
Obviamente, es posible que desee colocarlo en una función o clase para que pueda acceder desde cualquier lugar sin tener que duplicar el código en cualquier lugar.
Cometiste un simple error. Esto funcionará:
[NSString stringWithFormat: @"%.2lf", total]
No estoy familiarizado con el objetivo C, pero esto no es posible con el formato estándar de estilo printf.
El uso de% g ordenaría el trabajo, pero para números grandes o pequeños utilizaría la notación científica (por ejemplo, 9.6e + 6, 4.2e-7) en lugar de la notación decimal.
Aquí se hizo la pregunta equivalente para C / C ++ , y en ese caso la respuesta es usar% f y luego quitar cualquier 0 final de la cadena. No exactamente elegante.