Est-il possible de formater un flottant en C pour afficher uniquement jusqu'à 2 décimales s'il est différent de 0 en utilisant printf?
Ex:
12 => 12
12,1 => 12,1
12.12 => 12.12
J'ai essayé d'utiliser:
float f = 12;
printf("%.2f", f)
mais je reçois
12 => 12,00
12,1 => 12,10
12.12 => 12.12
Vous pouvez utiliser le %g
spécificateur de format:
#include <stdio.h>
int main() {
float f1 = 12;
float f2 = 12.1;
float f3 = 12.12;
float f4 = 12.1234;
printf("%g\n", f1);
printf("%g\n", f2);
printf("%g\n", f3);
printf("%g\n", f4);
return 0;
}
Résultat:
12 12.1 12.12 12.1234
Notez que, contrairement au spécificateur de format f
, si vous spécifiez un nombre avant le g
, il fait référence à la longueur du nombre entier (pas le nombre de décimales comme avec f
).
De notre discussion dans la réponse ci-dessus, voici mon programme qui fonctionne pour n'importe quel nombre de chiffres avant la décimale.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
float f1 = 12.13;
float f2 = 12.245;
float f3 = 1242.145;
float f4 = 1214.1;
int i = 0;
char *s1 = (char *)(malloc(sizeof(char) * 20));
char *s2 = (char *)(malloc(sizeof(char) * 20));
sprintf(s1, "%f", f1);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f1);
sprintf(s1, "%f", f2);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f2);
sprintf(s1, "%f", f3);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f3);
sprintf(s1, "%f", f4);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f4);
free(s1);
free(s2);
return 0;
}
Et voici la sortie
12.13
12.24
1242.15
1214.1
Pour ce que ça vaut, voici une implémentation ObjC simple:
// Usage for Output 1 — 1.23
[NSString stringWithFormat:@"%@ — %@", [self stringWithFloat:1],
[self stringWithFloat:1.234];
// Checks if it's an int and if not displays 2 decimals.
+ (NSString*)stringWithFloat:(CGFloat)_float
{
NSString *format = (NSInteger)_float == _float ? @"%.0f" : @"%.2f";
return [NSString stringWithFormat:format, _float];
}
% g ne le faisait pas pour moi - celui-ci oui :-) J'espère que c'est utile pour certains d'entre vous.