web-dev-qa-db-fra.com

Utilisez printf pour formater les flottants sans décimales si seuls les 0 à la fin

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

36
epignosisx

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

52
bernie

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

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.

6
StuFF mc