我的法語和英語電腦之間的代碼可移植性存在問題。事實上,英語使用點來分隔雙倍,因爲法語使用逗號。 問題是我無法在法語電腦上看到用英文寫的數字(帶點),因爲它需要逗號。用英語和法語朗讀fscanf的雙語朗朗
這樣做的好方法是什麼?
我雖然有關使法語和英語文件,但我認爲一個更好的解決方案應該存在
我的代碼與雙行居然是:
errcd *= fscanf(file, "%lf\n", &N->biais1->l[i]);
我的法語和英語電腦之間的代碼可移植性存在問題。事實上,英語使用點來分隔雙倍,因爲法語使用逗號。 問題是我無法在法語電腦上看到用英文寫的數字(帶點),因爲它需要逗號。用英語和法語朗讀fscanf的雙語朗朗
這樣做的好方法是什麼?
我雖然有關使法語和英語文件,但我認爲一個更好的解決方案應該存在
我的代碼與雙行居然是:
errcd *= fscanf(file, "%lf\n", &N->biais1->l[i]);
,你可以作爲一個字符串讀出數字,然後將其轉換爲雙....
int n;
double N;
char dummy[100];
fscanf("%s",dummy);
for (n=0;n<100;n++)
{ /* here you need to make a conversion , to . (or . to ,) */
if (dummy[n]==',') dummy[n]='.';
if (dummy[n]==\0) break;
}
N = atof(dummy);
變化區域。
一些僞代碼讓你開始。
#include <locale.h>
get current locale (`*localeconv()`)
for each line
read line into buffer.
convert using `strtod()`
if it fails to convert and has a trailing character
switch(failing character)
'.' : set locale to English (`setlocale()`) and try again
',' : set locale to French and try again
restore original locale
喜歡的東西:
char *locale_original = setlocale(LC_ALL, NULL);
char *locale_english = ...;
char *locale_french = ...;
char buf[100];
size_t i = 0;
while (i < max && fgets(buf, sizeof buf, file) != NULL) {
char *endptr;
N->biais1->l[i] = strtod(buf, &endptr);
if (endptr != buf) {
switch (*endptr) {
case '.': locale_original = setlocale(LC_ALL, locale_english); break;
case ',': locale_original = setlocale(LC_ALL, locale_english); break;
default:
handle_error();
break;
}
N->biais1->l[i] = strtod(buf, &endptr);
if (*endptr) {
handle_error();
break;
}
}
}
setlocale(LC_ALL, locale_original);
使用區域是處理不同的數字格式變化的標準方式。不幸的是,標準功能並不完整。
注意這不是一個英語與法語的問題,而是'「」'VS小數點。「。」。 [參考](https://en.wikipedia.org/wiki/Decimal_mark#Hindu.E2.80.93Arabic_numeral_system) – chux