Печать с плавающей запятой в 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 безопасное использование невозможно
Другие вопросы по тегам