古い質問ですが、別の方法があります。決定的な解決策ではない場合でも、少なくとも適切な回避策です。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <langinfo.h>
int main(void)
{
/* for LC_MEASUREMENT */
const char *nonmetric="_MM _US _LR";
char *measured;
printf("NL_MEASUREMENT: %s\n", nl_langinfo(_NL_MEASUREMENT_MEASUREMENT));
measured=getenv("LC_MEASUREMENT");
printf("\nLC_MEASUREMENT: %s\n", measured);
has_=strchr(measured, '_');
if(has_!=NULL && strstr(nonmetric, has_) != NULL)
printf("US Customary Units\n");
else
printf("Metric System\n");
/* for LC_MONETARY, LC_NUMERIC, LC_MESSAGE, LC_CTYPE and others */
struct lconv *lc;
setlocale(LC_ALL, "pt_BR.UTF-8");
lc=localeconv();
printf("\nLC_MONETARY, Currency symbol: %s\n", lc->currency_symbol);
printf("\nLC_NUMERIC, Decimal point: %s\n", lc->decimal_point);
printf("\nLC_MESSAGE, YESEXPR: %s\n", nl_langinfo(YESEXPR));
printf("\nLC_CTYPE, CODESET: %s\n", nl_langinfo(CODESET));
return 0;
}
(*)コードの2番目のブロックは、完全を期すためのものです。
ただし、例の最初の部分では、メートル単位について入手可能な情報を示しています。それほど多くはありませんが、現在は自由に使用できます。
国コードを識別するだけです。ただし、これら3か国(ミャンマー/ビルマ、米国、リベリア)に対してテストすることはできます。
- * _MM(my_MMまたはen_MM)
- * _US(chr_US、HAW_US、en_US、es_US、またはlkt_US)
- * _LR(ff_LR、kpe_LRまたはen_LR)
異なる場合は、メートル法が採用されている(または少なくとも部分的に採用されている)と見なすことができます。
環境変数なしでこのプログラムを呼び出して、構成を確認します。
$ ./lc_measurement.x
NL_MEASUREMENT: UTF-8
LC_MEASUREMENT: C.UTF-8
Metric System
LC_MONETARY, Currency symbol: R$
LC_NUMERIC, Decimal point: ,
LC_MESSAGE, YESEXPR: ^[+1SsyY]
LC_CTYPE, CODESET: UTF-8
$ LC_MEASUREMENT="kpe_LR" ./lc_measurement.x
NL_MEASUREMENT: UTF-8
LC_MEASUREMENT: kpe_LR
US Customary Units
LC_MONETARY, Currency symbol: R$
LC_NUMERIC, Decimal point: ,
LC_MESSAGE, YESEXPR: ^[+1SsyY]
LC_CTYPE, CODESET: UTF-8