Faire un flotteur n'afficher que deux décimales

296

J'ai la valeur 25.00en a float, mais quand je l'imprime à l'écran c'est le cas 25.0000000.
Comment afficher la valeur avec seulement deux décimales?

mskfisher
la source
var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (double: nombre))!
kalpeshdeo

Réponses:

648

Ce n'est pas une question de stockage du numéro, c'est une question de mode d'affichage. Lorsque vous le convertissez en chaîne, vous devez arrondir à la précision souhaitée, qui dans votre cas est de deux décimales.

Par exemple:

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

%.02findique au formateur que vous formatez un float ( %f) et que cela doit être arrondi à deux endroits et doit être complété par 0s.

Par exemple:

%f = 25.000000
%.f = 25
%.02f = 25.00
Andrew Grant
la source
7
J'ai remarqué que l'utilisation de% .2f renvoie en réalité 25,00 dans votre exemple et non 25. C'est étrange.
fulvio
3
La façon dont j'ai toujours compris était que le nombre après le point décimal disait combien de décimales vous aviez. Donc, .2f donnerait effectivement 25,00, et .4f donnerait 25,0000.
Erik S
3
Si quelqu'un est curieux de savoir comment on obtient réellement 25 .. @"%.f"fait l'affaire. Ce qui est écrit ci-dessus ne l'est pas .
Alex Gray
4
@acecapades, si vous utilisez@"%.*f", decimalPlaces, number
Jonathan.
12
Ce sera probablement un hors-sujet partiel mais j'ajouterais un autre format:%03.f = 025
SoftDesigner
197

Voici quelques corrections-

//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"

etc...

Vaibhav Saran
la source
Le dernier est-il exact? @ "%. 03f" = 3145,566? Comment avez-vous obtenu 0,566 au lieu de 0,560?
pixelfreak
l'entier qui détermine le nombre de décimales peut-il être une variable? comme @ "%. xf" où x peut être n'importe quel entier?
acecapades
Si vous rencontrez des problèmes avec @ "%. F", essayez @ "%. 0f". J'ai trouvé que cela fonctionnait pour ne pas avoir de décimales où l'autre ne le faisait pas
simon_smiley
1
Quelqu'un peut-il me dire pourquoi vous utiliseriez% .02f au lieu de seulement% .2f?
hinterbu
20

Vous pouvez également essayer d'utiliser NSNumberFormatter:

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

Vous devrez peut-être également définir le format négatif, mais je pense qu'il est assez intelligent pour le comprendre.

Meule
la source
vous avez besoin de ce flotteur numTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi
10

J'ai fait une extension rapide basée sur les réponses ci-dessus

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

usage:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
rythme de codage
la source
Cette solution semble également fonctionner avec CGFloat. Impressionnant!
eonist
C'est ce que je cherchais. Merci mon pote!
Tushar Katyal
9

En Swift Language, si vous voulez montrer que vous devez l'utiliser de cette façon. Pour affecter une valeur double dans UITextView, par exemple:

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

Si vous voulez afficher dans LOG comme comme object-c le fait en utilisant NSLog (), alors en Swift Language vous pouvez le faire de cette façon:

println(NSString(format:"%.2f", result))
imti
la source
3

Dans objective-c, si vous avez affaire à des tableaux de caractères réguliers (au lieu de pointeurs vers NSString), vous pouvez également utiliser:

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

OTOH, si vous voulez stocker cette valeur sur un tableau de caractères que vous pourriez utiliser:

sprintf(your_char_ptr, "%.02f", your_float_var);
Pablo Santa Cruz
la source
3

Le problème avec toutes les réponses est que la multiplication puis la division entraînent des problèmes de précision car vous avez utilisé la division. J'ai appris cela il y a longtemps en programmant sur un PDP8. La façon de résoudre ce problème est la suivante:

return roundf(number * 100) * .01;

Ainsi, 15,6578 renvoie seulement 15,66 et non 15,6578999 ou quelque chose d'inattendu comme ça.

Le niveau de précision que vous souhaitez dépend de vous. Ne divisez pas le produit, multipliez-le par l'équivalent décimal. Aucune conversion de chaîne drôle n'est requise.

ztalbot
la source
1

dans l'objectif -c, vous voulez afficher la valeur flottante en 2 décimales, puis passez l'argument indiquant le nombre de décimales que vous souhaitez afficher, par exemple 0,02f affichera 25,00 0,002f affichera 25,000

shaunak
la source
1

Voici quelques méthodes pour formater dynamiquement selon une précision:

+ (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;
    }
}

par exemple

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

=> 2,3453

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

=> 2

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

=> 2,35 (arrondi)

Ryan
la source
C'est une très bonne solution, un grand merci. Pouvez-vous m'expliquer comment cela fonctionne? Je vois que vous avez ajouté un symbole '%' supplémentaire.
Eugene Alexeev
1

Une autre méthode pour Swift (sans utiliser NSString):

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

PS cette solution ne fonctionne pas avec le type CGFloat uniquement testée avec Float&Double

Aks
la source
1
@Unknown downvoter c'est une solution de travail pour swift et également différente des autres réponses pour swift alors pourquoi?
Aks
si vous pouvez retourner un flotteur, vous pouvez toujours le convertir en CGFloat
eonist
1

Utilisez NSNumberFormatteravec maximumFractionDigitscomme ci-dessous:

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

Et vous obtiendrez 12.35

Allen Huang
la source
0

Si vous devez également faire flotter la valeur:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
loretoparisi
la source
0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
Rinju Jain
la source