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
DOT
sur ce qui est un point 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) 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