有关于使用千位/百万分隔符打印整数的问题。
我有一个文本文件,我得到了国家,城市,总人口。
我必须在文件中阅读,并按国家/地区排序。如果国家是一个国家,我必须按人口减少排序。
Textfile就像:
澳大利亚悉尼........ ......... 10.123.456
巴西...........圣保罗....... 7.123.345
我将所有3个读成一个单独的字符串。然后我擦除所有“。”在人口字符串中。然后我使用atoi()将填充字符串转换为整数。
现在,如果国家平等,我可以按人口排序。这种方式正常。
到目前为止一切顺利。但我需要将千万/百万分隔符用于印刷人口。
如果我使用字符串,使用“。”对于人口,排序不正常。 它的排序如下:
X ........ X ...... 1.123456
X ........ X ...... 10.123.456
X ........ X ...... 2.123.232
它必须看起来像:
澳大利亚悉尼........ ......... 10.123.456
澳大利亚布里斯班........ ....... 8.123.456
有没有办法通过再次添加分隔符来操作打印?
非常感谢提前
答案 0 :(得分:14)
imbue()
输出流,其locale具有所需的分隔符。例如:
#include <iostream>
#include <locale>
int main()
{
// imbue the output stream with a locale.
int i = 45749785;
std::cout << i << "\n";
std::cout.imbue(std::locale(""));
std::cout << i << "\n";
}
我的机器上的输出(和online demo):
45749785 45,749,785
如评论所述,并通过James Kanze回答,输入流也可以读取分离的int
值,而无需手动修改输入。
有关区域设置的详细概述,请参阅Stroustrop的Appendix D: Locales。
答案 1 :(得分:12)
使用支持所需分隔符的区域设置来读取 文件(这样你可以读取整数值)和 相同的语言环境来写入数据。
请注意,您可能没有这样的区域设置,或者您可能没有
你可能不知道它的名字(并使用命名的语言环境)
改变你不想改变的其他事情;在我的
机器,imbue
与""
的行为有所不同
编译器(或者我调用它的shell) - 你
如果您有严格的格式,则不应使用区域设置""
要求。 (使用区域设置""
适用于您的情况
希望格式依赖于用户环境
规格。)
在这种情况下,明确提供本地可能更好:
class MyNumPunct : public std::numpunct<char>
{
protected:
virtual char do_thousands_sep() const { return ','; }
virtual std::string do_grouping() const { return "\03"; }
};
int
main()
{
std::cout.imbue( std::locale( std::locale::classic(), new MyNumPunct ) );
std::cout << 123456789 << std::endl;
return 0;
}
当然,您也希望将此语言环境用于输入。
(此代码将为您提供"C"
语言环境,仅提供
分组改变了。)