本文共 1279 字,大约阅读时间需要 4 分钟。
转载自:
国际化议题通常被划分为数个不同的模块,例如:数值、日期时间、货币等
国际话的每个模块由locale内不同的对象处理, 我们将这样一个处理某一模块的对象称为facet locale则扮演了facet的容器。要存取locale的某个模块,可以相应的facet型别作为索引。
将facet作为template参数,传递给use_facet()函数,便可以取得特定的facetstd::use_facet<std::numpunct<char> >(loc);
下面大致描述了C++标准库中预先定义的一些facet。 其中每个facet都和一个类别关联, 这些类别在locale某些构造函数中用来组合出其他的locale,即产生新的locale 类别 Facet 用处 numeric num_get<>() 数值输入 num_put<>() 数值输出 numpunct<>() 数值I/O中用到的符号 time time_get<>() 日期时间输入 time_put<>() 日期时间输出 monetary money_get<>() 货币输入 money_put<>() 货币输出 moneypunct <>() 货币I/O中用到的符号 ctype ctype<>() 字符信息(toupper() , isupper()) codecvt<>() 在不同字符编码之间进行转换 collate collate<>() 字符串校勘(collation) messages messages<> 获取字符信息我们也可以定义自己的facet,从而进一步创建特定的locale。
下面实现了一个简单的facet: class ChineseBoolNames : public tsd::numpunct_byname<char> { public: ChineseBoolNames(const char* name):std::numpunct_byname<char>(name) { } protected: virtual std::string do_truename() const { return "zhen"; } virtual std::string do_falsename() const { return "jia"; } }; 要使用这个facet,就需要用到locale的一个构造函数: template<typename _Facet> locale(const locale& __other, _Facet* __f); 意思为产生一个新的locale,它和第一参数给定的locale对象基本相同, 唯一不同的是第二参数指定的那个facet 则我们可以如下使用我们定义的facet: std::locale loc(std::locale(""),new ChineseBoolNames("")); std::cout.imbue(loc); cout<<std::boolalpha<<true<<endl;