编写适应性强的程序,比如程序运行在美国的电脑,操作习惯是美国人的,运行在欧洲电脑上,就是欧洲人的,这种问题,其实在更早,大约当时的15年前就已经有有效果的解决方法。就是环境变量。在C语言中要读取到一个环境变量的值,可以用中定义的函数getenv。其实,区域设置本质上也就是这个问题,将货币处理设置相应的环境变量,数字,字符等,都设置上相应的环境变量,按照需要,总共应该有将近二十个环境变量,一一设置好了,问题就得以解决。
区域设置是一个比环境变量方法更改进的方案。你只要设置到一个区域,里面整套的几十个环境变量就相应的改变了。不用一一设置,不容易出错。这些环境变量大致可以分为以下几类(见p84):
控制整理顺序(LC_COLLATE);
字符分类(LC_CTYPE);
货币格式(LC_MONETARY);
其它的数据格式(LC_NUMERIC);
时间(LC_TIME);
区域设置是一个比环境变量方法更改进的方案。你只要设置到一个区域,里面整套的几十个环境变量就相应的改变了。不用一一设置,不容易出错。这些环境变量大致可以分为以下几类(见p84):
控制整理顺序(LC_COLLATE);
字符分类(LC_CTYPE);
货币格式(LC_MONETARY);
其它的数据格式(LC_NUMERIC);
时间(LC_TIME);
LC_ALL
类型
struct lconv
关于区域设置的具体实现,各特征参数都记录在struct lconv结构体中
struct lconv
{
char *currency_symbol; //当前场所的地方货币符号
char *int_curr_symbol; //当前场所的国际货币符号
char *mon_decimal_point; //货币量的小数点
char *mon_grouping; //货币量每个数字组的尺寸
char *mon_thousands_sep; //货币量小数点左边的数字分组字符
char *negative_sign; //负货币量表示符号的字符串
char *positive_sign; //正货币量表示符号的字符串
char *decimal_point; //非货币量的小数点
char *grouping; //非货币量的每个数字的尺寸
char *thousands_sep; //非货币量小数点左边数字分组字符
char frac_digits; //格式化货币量中小数点右边的数字位数
char int_frac_digits; //国际格式化货币量中小数点右边的数字位数
char n_cs_precedes; //如果货币符号位于负格式货币量之前,它设置为1;如果符号在值以后,设置为0
char n_sep_by_space; //如果货币符号通过空格从负格式货币量中分离则设置为1,没有空格则为0
char n_sign_posn; //负格式货币量值正符号的位置
char p_cs_precedes;//如果货币符号位于非负格式货币量之前,它设置为1,如果符号值以后,设置为0
char p_sep_by_space; //如果货币符号通过空格从非负格式货币量中分离则设置为1,没有空格为0
char p_sign_posn; //非负格式货币量值正符号的位置
};函数
struct lconv* localeconv (void);
localeconv用于返回当前区域中的数字和货币信息(保存在struct lconv结构实例中)
char* setlocale (int category, const char* locale);
其中category参数可以为LC_COLLATE,LC_CTYPE,LC_MONETARY,LC_NUMERIC,LC_TIME,LC_ALL
a,locale可以为"C",或者别的长度不为0的串,返回此时locale串指针,执行失败返回NULL(程序默认执行了setlocale(LC_ALL,"C"))。
b,指定为"",设置成了本地区域,既locale为环境变量LOCALE的值 (了解更多,参考LOCFILE)。
c,指定为NULL,返回当前(上一次)区域设置的locale串指针。
参考文献:
setlocale 介绍:http://www.cnblogs.com/hnrainll/archive/2011/05/07/2039700.html
locale.h 的来由:http://blog.sina.com.cn/s/blog_5d323f950101bget.html
setlocale 介绍:http://blog.csdn.net/alentam/article/details/2281121
版权声明:本文为lion_hbeu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。