首页 > 解决方案 > 如何为 Boost.Locale 中的数字指定自定义小数分隔符?

问题描述

我已经多次阅读 Boost.Locale 文档,但仍然找不到这个看似简单的问题的答案:我需要使用特定的语言环境(例如 ru_RU)输出,但使用自定义的小数分隔符(例如点代替逗号)。这可能吗?

对于日期,有允许指定自定义日期时间格式字符串的“ftime”操纵器。但是数字有类似的东西吗?

谢谢!

标签: c++boostlocalizationinternationalizationboost-locale

解决方案


为了完整起见,我将发布我是如何解决问题的。假设我们有一个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覆盖)。


推荐阅读