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%克}格式是不敏感的區域設置)
下面的程序演示)使用的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;
}
輸出:
[email protected]:./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
[email protected]:
閱讀手冊後,我期望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);
我仍然無法得到這個工作。無論如何,當我們談論數字時,談論區域設置是很奇怪的。幾乎整個歐洲都使用逗號作爲小數分隔符,所以我現在很奇怪人們是如何做到這一點的。好的,我可以將雙打轉換爲字符串並將它們存儲爲字符串,但是我的數據庫中有字符串而不是數字,大多數情況下完全不可接受。 – 2012-03-03 16:29:23
你是否也修復了'))? snprintf()之後緩衝區包含什麼?順便說一句,在我看來,該語言環境不適用於libc的東西。手冊頁顯示舊版本中存在不同的標準行爲。 – wildplasser 2012-03-03 16:31:55
是的,我修好了。 IL.klc是從文件重新生成8位數字。如果我做printf(「%f \ n」,IL.klc);我得到了0,000000。同樣在緩衝區中。和MySql一樣,它和數字很好地結合在一起。如果我將數字寫回文件,無論小數點是什麼,它都會重新打包成8位。所以我認爲PQ會以二進制的方式存儲我的號碼。我仍然認爲我做錯了什麼,因爲存儲數字對於像PQ這樣龐大的系統是非常基本的操作,並且它不應該連接到本地。 – 2012-03-03 17:03:39