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?


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

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...


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.


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

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))

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);

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.


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


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)


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


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


0

Si vous devez également faire flotter la valeur:

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

0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.