可能是描述我希望实现的最佳方式,即组合以下线程的解决方案: Windows Unicode C++ Stream Output Failure(但使用utf-16)
和
How to print a number with a space as thousand separator?(但以点为分隔符)
以下解决方案尝试对输出没有影响:
//include appropriate headers
struct DotSepUTF16 : public codecvt_utf16<wchar_t, 0x10ffffUL, little_endian>
{
wchar_t do_thousands_sep()const{ return L'.'; }
string do_grouping(){ return "\3"; }
};
int main()
{
unsigned long num=135412565UL;
locale dot_separated(locale(), new DotSepUTF16);
wofstream fout(L"C:\\Work\\report.htm");
fout.imbue(dot_separated);
const unsigned short BOM= 0xFEFF;
fout.write((wchar_t*)&BOM, 1);
fout<<num;//still no separation
}
//second attempt
struct DotSep : public numpunct < wchar_t >
{
wchar_t do_thousands_sep()const{ return L'.'; }
string do_grouping(){ return "\3"; }
};
int main(void)
{
unsigned long num=135412565UL;
locale utf16(locale(), new codecvt_utf16<wchar_t, 0x10ffffUL, little_endian>());
locale dot_separated(locale(), new DotSep);
locale mylocale(utf16, dot_separated, locale::numeric);//try to combine the locales for utf16 and dot separation
wofstream fout(L"C:\\Work\\report.htm");
fout.imbue(mylocale);
const unsigned short BOM= 0xFEFF;
fout.write((wchar_t*)&BOM, 1);
fout<<num; //again no dots
}
另外,由于MVS / windows已经将UTF16用于宽字符串,我想知道为什么转换为utf16是必要的。我认为,这是浪费CPU资源。如果没有额外的不必要的转换,是不是可以写文件?以二进制模式编写是可能的,但有点傻,因为它会放弃输出流提供的所有便利
编辑:忘了提到我使用MVS 2013和英特尔编译器答案 0 :(得分:1)
第二种变体在您do_grouping
const
后生效,如
string do_grouping() const { return "\3"; }
正如所写,你的重载,但不会覆盖基类方法。