Печать с плавающей запятой в C
Возможный дубликат:
Выведите 1000000 как 1,000,000 и так далее
У меня есть переменная с плавающей точкой в формате xxxxxxxx.xx (например, 11526.99). Я хотел бы напечатать его как 11 562,99 с запятой. Как я могу вставить запятую в C?
2 ответа
Пытаться:
#include <locale.h>
#include <stdio.h>
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);
}
Это зависит от текущей локали. Локали C и POSIX не имеют разделителя тысяч. Вместо того, чтобы наследовать языковой стандарт от среды, вы можете самостоятельно установить для него языковой стандарт, который, как вы знаете, использует разделитель тысяч. В моей системе, используя "en_NZ"
обеспечивает разделитель тысяч.
Приведенная ниже функция addcommas - это версия без языка, которая допускает отрицательные числа с плавающей запятой (не работает с показателем типа 3.14E10
хоть)
#include <stdio.h>
#include <string.h>
#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 string
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
}
Как это назвать, например (основной пример)
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;
}
Пример инструкции по компиляции
gcc -Wall comma.c -o comma
дела
./comma
Должен выводить
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
что такое точка - Задавать
COMMA
на то, что должно быть запятой MAX
при значении 50 предполагается, что число с плавающей точкой, преобразованное как строка, будет содержать не более 49 символов (увеличениеMAX
в сомнениях)- Возвращает указатель на добавленную запятую строку из числа с плавающей запятой, заданного в качестве параметра, указатель на статическую область, таким образом
- addcommas не является реентерабельным, и значение, на которое указывает возвращаемый указатель (обычно), изменяется после каждого вызова, например.
- в
char *a = addcommas(3.1415) ; char *b = addcommas(2.7182) ;
после второго вызоваaddcommas безопасное использование невозможно