rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES (%d, '%s', '%s', '%s', '%s', '%s', %f);"
, o, k, dt, es, tagname, meas, IL.klc);
ОБНОВЛЕНИЕ: если есть проблемы с локалью, setlocale () может помочь вам установить локальный внутри вашей программы. LC_ALL = POSIX (или C) всегда должен присутствовать. (вполне может быть, что один из форматов {% e% f% g} нечувствителен к настройкам локали)
Следующая программа демонстрирует использование setlocale ():
#include <stdio.h>
#include <locale.h>
#pragma DONT define DEFAULT_LOCALE "POSIX"
#define DEFAULT_LOCALE "nl_NL.utf8"
/* LC_NUMERIC LC_ALL */
int main(int argc, char **argv)
{
double val;
char *old, *new;
val = 1024 * 1024;
val /= 10;
printf ("Original: Val=%f\n", val);
new = argv[1] ? argv[1] : DEFAULT_LOCALE ;
old = setlocale (LC_ALL, new );
printf("Old=%s, New=%s\n", old, new );
printf ("After change: Val=%f\n", val);
new = setlocale (LC_ALL, old );
printf("Old=%s, New=%s\n", new, old);
printf ("After restore: Val=%f\n", val);
return 0;
}
Выход:
plasser@pisbak:./a.out
Original: Val=104857.600000
Old=nl_NL.utf8, New=nl_NL.utf8
After change: Val=104857,600000
Old=nl_NL.utf8, New=nl_NL.utf8
After restore: Val=104857,600000
plasser@pisbak:
После прочтения руководств я ожидал, что setlocale () вернет старую настройку, но, похоже, это не так. Может быть, я случайно изменил некоторые глобальные настройки: - [
ОБНОВЛЕНИЕ: всегда полезно явным образом приводить аргументы к * printf () функциям.
#include <locale.h>
(void) setlocale (LC_NUMERIC, "POSIX" );
rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES (%d, '%s', '%s', '%s', '%s', '%s', %f);"
, (int) o, k, dt, es, tagname, meas, (double) IL.klc);