Как записать в файл вещественное число с точкой вместо запятой?

266
15 декабря 2016, 16:07

Покажите, пожалуйста, как для функции fprintf задать форматирование так, чтобы она double писала в файл не через "," а через ".". Если в fprintf этого никак не сделать, то, может быть, как-то у cout это можно сделать?

Answer 1

Действительно, все дело в локали, как и сказал @Etki.

Возможно, для Вашей цели достаточно установить LC_NUMERIC в "C", а остальные категории оставить без изменения.

Вот пример:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int
main (int ac, char *av[])
{
  double d = 10.1;
  char *loc = setlocale(LC_ALL, "");
  printf("DEFAULT LOCALE  %s\nd = %f\n", loc, d);
  loc = setlocale(LC_NUMERIC, "ru_RU.utf8");
  printf("%s: d = %f\n", loc, d);
  loc = setlocale(LC_NUMERIC, "C");
  printf("%s: d = %f\n", loc, d);
  return puts("End") == EOF;
}
avp@avp-ubu1:hashcode$ gcc c.c
avp@avp-ubu1:hashcode$ ./a.out 
DEFAULT LOCALE  LC_CTYPE=en_US.UTF-8;LC_NUMERIC=en_SG.UTF-8;LC_TIME=en_SG.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_SG.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_SG.UTF-8;LC_NAME=en_SG.UTF-8;LC_ADDRESS=en_SG.UTF-8;LC_TELEPHONE=en_SG.UTF-8;LC_MEASUREMENT=en_SG.UTF-8;LC_IDENTIFICATION=en_SG.UTF-8
d = 10.100000
ru_RU.utf8: d = 10,100000
C: d = 10.100000
End
avp@avp-ubu1:hashcode$
READ ALSO
Необъяснимое поведение

Необъяснимое поведение

Какого чёрта?

239
Правильный абстрактный класс

Правильный абстрактный класс

Помогите, пожалуйста, правильно описать абстрактный класс Block

223
Время выполнения кода

Время выполнения кода

Какую функцию стоит использовать, чтобы получить значение, которое не будет фиксировать время других процессов? Язык С++

256
Сброка QT-приложения linux (Ubuntu)

Сброка QT-приложения linux (Ubuntu)

Пытаюсь собрать приложение, компилятор выдает ошибку:

208