如何为 Boost.Locale 中的数字指定自定义小数点分隔符?

How to specify a custom decimal separator for numbers in Boost.Locale?

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

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

谢谢!

您可以使用 C++ <locale> 库。

std::string russian_number_string(int n) {
    std::stringstream ss;
    ss.imbue(std::locale("ru_RU"));
    ss << n;
    return ss.str();
}

为了完整起见,我将 post 我是如何解决这个问题的。 假设我们有一个 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 "[=10=]";
    }
};

// ...

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 覆盖)。