Hacer un flotador solo muestra dos decimales


296

Tengo el valor 25.00en a float, pero cuando lo imprimo en pantalla lo es 25.0000000.
¿Cómo puedo mostrar el valor con solo dos decimales?


var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (double: number))!
kalpeshdeo

Respuestas:


648

No se trata de cómo se almacena el número, se trata de cómo lo está mostrando. Al convertirlo en una cadena, debe redondear a la precisión deseada, que en su caso es dos decimales.

P.ej:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

%.02fle dice al formateador que formateará un float ( %f) y que debe redondearse a dos lugares y debe rellenarse con 0s.

P.ej:

%f = 25.000000
%.f = 25
%.02f = 25.00

77
Noté que usar% .2f en realidad devuelve 25.00 en su ejemplo y no 25. Esto es extraño.
fulvio

3
La forma en que siempre entendí fue que el número después del punto decimal decía cuántos decimales obtuviste. Entonces, .2f daría 25.00, y .4f daría 25.0000.
Erik S

3
Si alguien tiene curiosidad sobre cómo uno realmente consigue 25 ... @"%.f"hace el truco. Lo que está escrito arriba, no .
Alex Gray

44
@acecapades, si usas@"%.*f", decimalPlaces, number
Jonathan.

12
Probablemente sea un tema parcial, pero agregaría otro formato:%03.f = 025
SoftDesigner

197

Aquí hay algunas correcciones.

//for 3145.559706

Swift 3

let num: CGFloat = 3145.559706
print(String(format: "%f", num)) = 3145.559706
print(String(format: "%.f", num)) = 3145
print(String(format: "%.1f", num)) = 3145.6
print(String(format: "%.2f", num)) = 3145.56
print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f"
print(String(format: "%.3f", num)) = 3145.560
print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"

Obj-C

@"%f"    = 3145.559706
@"%.f"   = 3146
@"%.1f"  = 3145.6
@"%.2f"  = 3145.56
@"%.02f" = 3145.56 // which is equal to @"%.2f"
@"%.3f"  = 3145.560
@"%.03f" = 3145.560 // which is equal to @"%.3f"

y así...


¿Es el último exacto? @ "%. 03f" = 3145.566? ¿Cómo obtuviste .566 en lugar de .560?
pixelfreak

¿Puede el entero que determina el número de decimales ser una variable? como @ "%. xf" donde x puede ser cualquier número entero?
acecapades

Si tiene problemas con @ "%. F", intente con @ "%. 0f". Descubrí que esto funcionaba para no obtener decimales donde el otro no lo hacía
simon_smiley

1
¿Alguien puede decirme por qué usaría% .02f en lugar de solo% .2f?
hinterbu

20

También puede intentar usar NSNumberFormatter:

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];

Es posible que también necesite establecer el formato negativo, pero creo que es lo suficientemente inteligente como para descubrirlo.


necesita este flotante numTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi

10

Hice una extensión rápida basada en las respuestas anteriores

extension Float {
    func round(decimalPlace:Int)->Float{
        let format = NSString(format: "%%.%if", decimalPlace)
        let string = NSString(format: format, self)
        return Float(atof(string.UTF8String))
    }
}

uso:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true

Esta solución también parece funcionar con CGFloat. ¡Increíble!
eonista

Esto es lo que estaba buscando. ¡Gracias amigo!
Tushar Katyal

9

En Swift Language, si desea mostrar, debe usarlo de esta manera. Para asignar un valor doble en UITextView, por ejemplo:

let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)

Si desea mostrar en el REGISTRO como ocurre con Objective-c usando NSLog (), en Swift Language puede hacerlo de esta manera:

println(NSString(format:"%.2f", result))

3

EN el objetivo c, si está tratando con matrices de caracteres regulares (en lugar de punteros a NSString) también podría usar:

printf("%.02f", your_float_var);

OTOH, si lo que desea es almacenar ese valor en una matriz de caracteres que podría usar:

sprintf(your_char_ptr, "%.02f", your_float_var);

3

El problema con todas las respuestas es que multiplicar y luego dividir resulta en problemas de precisión porque usaste la división. Aprendí esto hace mucho tiempo de la programación en un PDP8. La forma de resolver esto es:

return roundf(number * 100) * .01;

Por lo tanto, 15.6578 devuelve solo 15.66 y no 15.6578999 o algo no deseado como ese.

El nivel de precisión que desea depende de usted. Simplemente no divida el producto, multiplíquelo por el equivalente decimal. No se requiere conversión de cadena divertida.


1

en el objetivo -c si desea mostrar el valor flotante en un número decimal 2 y luego pasar el argumento que indica cuántos puntos decimales desea mostrar, por ejemplo, 0.02f imprimirá 25.00 0.002f imprimirá 25.000


1

Aquí hay algunos métodos para formatear dinámicamente de acuerdo con una precisión:

+ (NSNumber *)numberFromString:(NSString *)string
{
    if (string.length) {
        NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
        f.numberStyle = NSNumberFormatterDecimalStyle;
        return [f numberFromString:string];
    } else {
        return nil;
    }
}

+ (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision
{
    NSNumber *numberValue = [self numberFromString:string];

    if (numberValue) {
        NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision];
        return [NSString stringWithFormat:formatString, numberValue.floatValue];
    } else {
        /* return original string */
        return string;
    }
}

p.ej

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];

=> 2.3453

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];

=> 2

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];

=> 2.35 (redondear hacia arriba)


Esa es una muy buena solución, muchas gracias. ¿Me puedes explicar cómo funciona? Veo que has agregado el símbolo '%' adicional.
Eugene Alexeev

1

Otro método para Swift (sin usar NSString):

let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")

PD: esta solución no funciona con el tipo CGFloat solo probado con Float&Double


1
@ Votante desconocido: esta es una solución funcional para Swift y también es diferente de otras respuestas para Swift, ¿por qué?
Aks

si puede devolver un flotador, siempre puede convertirlo en un CGFloat
eonist

1

Usar NSNumberFormattercon maximumFractionDigitslo siguiente:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);

Y obtendrás 12.35


0

Si también necesita un valor flotante:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);

0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.