Imprimer un float avec des virgules en C

Dupliquer possible:
Résultat de 1 000 000, etc.

J’ai une variable float au format xxxxxxxx.xx (par exemple, 11526.99). Je voudrais l’imprimer comme 11 562,99 avec une virgule. Comment puis-je insérer une virgule en C?

Essayer:

 #include  #include  int main() { float f = 12345.67; // obtain the existing locale name for numbers char *oldLocale = setlocale(LC_NUMERIC, NULL); // inherit locale from environment setlocale(LC_NUMERIC, ""); // print number printf("%'.2f\n", f); // set the locale back setlocale(LC_NUMERIC, oldLocale); } 

Cela dépend des parameters régionaux actuels. Les parameters régionaux C et POSIX ne possèdent pas de séparateur de milliers. Au lieu d’hériter les parameters régionaux de l’environnement, vous pouvez définir vous-même un paramètre régional qui, à votre avis, utilise un séparateur de milliers. Sur mon système, l’utilisation de "en_NZ" fournit un séparateur de milliers.

La fonction addcommas ci-dessous est une version sans locale , qui autorise les flottants négatifs (elle ne fonctionne pas avec un exposant comme 3.14E10 ).

 #include  #include  #define DOT '.' #define COMMA ',' #define MAX 50 static char commas[MAX]; // Where the result is char *addcommas(float f) { char tmp[MAX]; // temp area sprintf(tmp, "%f", f); // refine %f if you need char *dot = strchr(tmp, DOT); // do we have a DOT? char *src,*dst; // source, dest if (dot) { // Yes dst = commas+MAX-strlen(dot)-1; // set dest to allow the fractional part to fit strcpy(dst, dot); // copy that part *dot = 0; // 'cut' that frac part in tmp src = --dot; // point to last non frac char in tmp dst--; // point to previous 'free' char in dest } else { // No src = tmp+strlen(tmp)-1; // src is last char of our float ssortingng dst = commas+MAX-1; // dst is last char of commas } int len = strlen(tmp); // len is the mantissa size int cnt = 0; // char counter do { if ( *src<='9' && *src>='0' ) { // add comma is we added 3 digits already if (cnt && !(cnt % 3)) *dst-- = COMMA; cnt++; // mantissa digit count increment } *dst-- = *src--; } while (--len); return dst+1; // return pointer to result } 

Comment l’appeler, par exemple (exemple principal )

 int main () { printf ("%s\n", addcommas(0.31415)); printf ("%s\n", addcommas(3.1415)); printf ("%s\n", addcommas(31.415)); printf ("%s\n", addcommas(314.15)); printf ("%s\n", addcommas(3141.5)); printf ("%s\n", addcommas(31415)); printf ("%s\n", addcommas(-0.31415)); printf ("%s\n", addcommas(-3.1415)); printf ("%s\n", addcommas(-31.415)); printf ("%s\n", addcommas(-314.15)); printf ("%s\n", addcommas(-3141.5)); printf ("%s\n", addcommas(-31415)); printf ("%s\n", addcommas(0)); return 0; } 

Exemple d’instruction de compilation

 gcc -Wall comma.c -o comma 

Faire

 ./comma 

Devrait sortie

 0.314150 3.141500 31.415001 314.149994 3,141.500000 31,415.000000 -0.314150 -3.141500 -31.415001 -314.149994 -3,141.500000 -31,415.000000 0.000000 
  • Définir DOT sur ce qui est un point
  • Définissez COMMA sur ce qui est supposé être une virgule
  • MAX réglé à 50 suppose que le float converti en chaîne ne sera pas plus de 49 caractères (augmenter MAX en cas de doute)
  • Renvoie un pointeur sur la chaîne ajoutée par des virgules à partir du flottant donné en paramètre, pointeur sur une zone statique, ainsi
    • addcommas n’est pas réentrant , et la valeur indiquée par le pointeur renvoyé (généralement) change après chaque appel, par exemple.
    • dans char *a = addcommas(3.1415) ; char *b = addcommas(2.7182) ; char *a = addcommas(3.1415) ; char *b = addcommas(2.7182) ; un ne peut plus être utilisé en toute sécurité après le deuxième appel à addcommas