这是一个老问题,但还有另一种方法。如果不是一个明确的解决方案,至少是一个很好的解决方法。
#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;
}
(*) 第二个代码块只是为了完整性。
但是该示例的第一部分提供了有关公制单位的可用信息。它并不多,但它目前是您可以使用的。
它只是标识国家代码。但是您可以针对这 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