我没有成功地尝试从 std::locale 中删除分组(千位分隔符)。
我需要从操作系统中设置的区域设置(例如 sk_SK 区域设置)中删除它,但保留所有其他与区域设置相关的格式特征(小数分隔符等)。
我的一些尝试在下面的代码中。看起来像是将语言环境与 no_separator 结合起来,剥离所有 numpunct 特征并将它们全部重置回“C”语言环境,而不是仅修改 do_grouping 特征。
(Windows10、VS、SDK 10.0、MSVC v142)
#include <iostream>
#include <locale>
#include <sstream>
struct no_separator : std::numpunct<char>
{
protected:
virtual string_type do_grouping() const
{
return "\0";
} // groups of 0 (disable)
};
int main()
{
std::cout.precision(8);
std::cout.width(12);
std::cout << "Test \"C\": " << 1234.5678 << std::endl; // OK - 1234.5678
std::locale skSKLocale("sk_SK");
std::cout.imbue(skSKLocale);
std::cout << "Test skSK: " << 1234.5678 << std::endl; // OK - 1 234,5678
//std::locale::global(skSKLocale);
std::locale localeNoThousandsSeparator = std::locale(skSKLocale, new no_separator());
std::locale finishedLoc = skSKLocale.combine<std::numpunct<char>>(localeNoThousandsSeparator);
std::cout.imbue(localeNoThousandsSeparator);
std::cout << "Test localeNoThousandsSeparator: " << 1234.5678 << std::endl; // BAD - expected 1234,5678, got 1234.5678
std::cout.imbue(finishedLoc);
std::cout << "Test finishedLoc: " << 1234.5678 << std::endl; // BAD - expected 1234,5678, got 1234.5678
}
谢谢您的帮助。
您的方面不知道 sk 区域设置。它只是使用默认实现。您可能希望将自定义
numpunct
的所有其他方法转发到您正在修改的任何语言环境的相关方面,例如:
struct no_separator : std::numpunct<char>
{
no_separator(std::locale& base_locale) :
np(std::use_facet< std::numpunct<char> >(base_locale)) {
}
protected:
string_type do_grouping() const override { return ""; }
char_type do_decimal_point() const override { return np.decimal_point(); }
char_type do_thousands_sep() const override { return np.thousands_sep(); }
string_type do_truename() const override { return np.truename(); }
string_type do_falsename() const override { return np.truename(); }
const std::numpunct<char> & np;
};