我已经多次阅读 Boost.Locale 文档,但仍然找不到这个看似简单的问题的答案:我需要使用特定的语言环境(例如 ru_RU)输出,但使用自定义的小数分隔符(例如点代替逗号)。这可能吗?
对于日期,有允许指定自定义日期时间格式字符串的“ftime”操纵器。但是数字有类似的东西吗?
谢谢!
我已经多次阅读 Boost.Locale 文档,但仍然找不到这个看似简单的问题的答案:我需要使用特定的语言环境(例如 ru_RU)输出,但使用自定义的小数分隔符(例如点代替逗号)。这可能吗?
对于日期,有允许指定自定义日期时间格式字符串的“ftime”操纵器。但是数字有类似的东西吗?
谢谢!
为了完整起见,我将发布我是如何解决问题的。假设我们有一个locale
对象并且需要使用自定义小数点字符sep
:
template <class charT>
class DecimalPointFacet : public std::numpunct<charT> {
charT _sep;
public:
explicit DecimalPointFacet(charT sep): _sep(sep) {}
protected:
[[nodiscard]] charT do_decimal_point() const override
{
return _sep;
}
[[nodiscard]] typename std::numpunct<charT>::string_type do_grouping() const override
{
return "\0";
}
};
// ...
std::locale locale = obtainLocale();
const char sep = obtainDecimalSeparator();
locale = std::locale(locale, new DecimalPointFacet<char>(sep);
std::cout.imbue(locale);
std::cout << someNumber;
另请注意,DecimalPointFacet 会关闭数字分组,这对我来说也很方便(如果您不需要,请删除do_grouping
覆盖)。
您可以使用 C++<locale>
库。
std::string russian_number_string(int n) {
std::stringstream ss;
ss.imbue(std::locale("ru_RU"));
ss << n;
return ss.str();
}