如何为 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
覆盖)。
我已经多次阅读 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
覆盖)。