打印数千和百万分隔符的整数

时间:2013-07-08 15:26:40

标签: c++ fstream separator

有关于使用千位/百万分隔符打印整数的问题。

我有一个文本文件,我得到了国家,城市,总人口。

我必须在文件中阅读,并按国家/地区排序。如果国家是一个国家,我必须按人口减少排序。

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

有没有办法通过再次添加分隔符来操作打印?

非常感谢提前

2 个答案:

答案 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"语言环境,仅提供 分组改变了。)