47 votes

Utiliser printf pour formater les flottants sans décimales si seulement des 0 sont présents à la fin.

Est-il possible de formater un flottant en C pour qu'il n'affiche que 2 décimales si elles sont différentes de 0 à l'aide de 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

1 votes

63voto

bernie Points 44206

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

Il convient de noter que, contrairement à la f si vous spécifiez un nombre avant le format g il se réfère à la longueur du nombre entier (et non le nombre de décimales comme dans le cas de f ).

5 votes

Vous souhaitez toujours disposer de la %.2g pour qu'il se limite à 2 décimales.

3 votes

D'ailleurs, pour le f le nombre représente des chiffres décimaux, mais pour le format g il s'agit de la longueur totale du numéro.

0 votes

Oops mon erreur. Comment cela fonctionne-t-il si vous ne savez pas combien de chiffres se trouvent avant la virgule ? Je sais que l'on peut le trouver et utiliser une taille variable mais cela semble être beaucoup de travail pour cela.

7voto

twain249 Points 5292

A partir 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 le résultat

12.13
12.24
1242.15
1214.1

6voto

StuFF mc Points 1146

Pour ce que cela vaut, voici une simple implémentation en ObjC :

// 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 me convenait pas - celui-ci oui :-) J'espère que cela sera utile à certains d'entre vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X