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

d0z*_*zer 12 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

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

提前谢谢了

hmj*_*mjd 18

imbue()具有所需分隔符的语言环境的输出流.例如:

#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";
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上输出(和在线演示):

45749785
45,749,785

正如评论和回答的那样,詹姆斯·坎泽(James Kanze)也将输入流加入,以便在int不手动修改输入的情况下读取分离的值.


有关语言环境的详细概述,请参阅Stroustrop的附录D:语言环境.


Jam*_*nze 13

使用支持所需分隔符的区域设置来读取文件(这样可以将值读取为整数),并使用相同的区域设置来写入数据.

请注意,您可能没有这样的区域设置,或者如果您这样做,您可能不知道它的名称(并且使用命名区域设置可能会更改其他内容,您不希望更改); 我的机器上,imbue与荷兰国际集团""的行为不同根据编译器(或者外壳,我从调用它) -你不应该使用的语言环境"",如果您有严格的格式要求.(""当您希望格式依赖于用户环境规范时 ,使用区域设置.)

在这种情况下,最好明确提供本地:

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;
}
Run Code Online (Sandbox Code Playgroud)

当然,您也希望将此语言环境用于输入.(此代码将为您提供"C"区域设置,仅更改分组.)

  • @user13947194 方面是引用计数的。在此代码中,创建的“std::locale”将增加“MyNumPunct”对象的引用计数,其析构函数将减少引用计数,从而销毁构面。您无需执行任何额外操作即可获得此行为。 (2认同)