locale.h 区域设置相关,主要针对时间日期、货币格式、字符控制、数字格式等以满足某区域的设置需要。
locale设置类别主要包括以下几个宏定义的类别:
LC_ALL:设置所有的类别;
LC_COLLATE:设置控制整理顺序;
LC_CTYPE:设置字符分类;
LC_MONETARY:设置货币的格式;
LC_NUMERIC:设置数字格式,如小数点后位数;
LC_TIME:设置时间日期格式;
某些C标准库实现还提供了其他类型的设置类别扩展,如glibc实现约有12种类型;不过除以上类别外的其他类别在移植性方面可能会有影响。
其他的如:
LC_MESSAGES:信息提示、错误信息、状态信息、标题、标签、按钮和菜单等信息类别;
LC_PAPER:纸张尺寸大小类别;
LC_NAME:名称书写类别;
LC_ADDRESS:地址书写类别;
LC_TELEPHONE:电话号码类别;
LC_MEASUREMENT:度量测量方式类别;
LC_IDENTIFICATION:locale自身信息类别;
此外在设置类别是存在一定的优先级别,即一般满足LC_ALL > LC_* >LANG;也即是前者会覆盖后者的设置,各个类别会影响相应类别的相关函数行为,如mbstowcs、strftime等。
两个比较重要的函数,setlocale、localeconv分别为设置某类别的区域本地化信息并返回相应设置的地域化信息、获取当前设置的区域格式。
char *setlocale( int category, const char *locale ):category即为类别,locale为设置区域信息,如"CHS","C","",”US“,等;一般可根据需要设置区域信息,不过若需要
还原时一般针对某种类别或所有的设置使用“C”即可使用默认的C编译环境,“”则使用本地区域的环境。
struct lconv * localeconv(void):返回值为一个结构,各主要成员参数分别为:
decimal_point:小数点;
thousands_sep:千位数分隔符;
grouping:分组,如3时,则为1 000 000 000的格式分组;
int_curr_symbol:当前货币符号前置标识,如CNY,USD等;
currency_symbol:当前货币符号标识,如¥、$等;
mon_decimal_point:货币小数点;
mon_thousands_sep:货币千位数分隔符;
mon_grouping:货币分组;
positive_sign:正值符号标识;
negative_sign:负值符号标识;
int_frac_digits:国际货币小数数字;
frac_digits:货币小数数字;
p_cs_precedes、p_sep_by_space、n_cs_precedes、n_sep_by_space、p_sign_posn、n_sign_posn:则为0或者1的值,主要用以表明符号所处的位置。
glibc以及微软的lconv结构还有其他的成员参数,同样的这些成员也可能会有移植性问题;
除了以上两个函数外glibc还提供了newlocale、duplocale、freelocale、uselocale区域设置的接口函数;微软的也提供了_create_locale、_free_locale、_get_current_locale、
_configthreadlocale区域设置接口,所有的以上这些接口可能都会影响可移植性。