J'ai la valeur 25.00
en a float
, mais quand je l'imprime à l'écran c'est le cas 25.0000000
.
Comment afficher la valeur avec seulement deux décimales?
J'ai la valeur 25.00
en a float
, mais quand je l'imprime à l'écran c'est le cas 25.0000000
.
Comment afficher la valeur avec seulement deux décimales?
Réponses:
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];
%.02f
indique au formateur que vous formatez un float ( %f
) et que cela doit être arrondi à deux endroits et doit être complété par 0
s.
Par exemple:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
fait l'affaire. Ce qui est écrit ci-dessus ne l'est pas .
@"%.*f", decimalPlaces, number
%03.f = 025
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...
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.
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
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))
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);
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.
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)
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
Utilisez NSNumberFormatter
avec maximumFractionDigits
comme ci-dessous:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
Et vous obtiendrez 12.35
Si vous devez également faire flotter la valeur:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];