17

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

我有一个文本文件,其中有国家、城市、总人口。

我必须阅读文件,并按国家/地区排序。如果国家是平等的,我必须按人口降序排序。

文本文件就像:

澳大利亚............悉尼............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

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

提前谢谢了

4

2 回答 2

25

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";
}

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

45749785
45,749,785

正如James Kanzeint评论和回答的那样,输入流也可以在不手动修改输入的情况下读取分离的值。


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

于 2013-07-08T15:33:04.213 回答
17

使用支持所需分隔符的语言环境来读取文件(这样您就可以将值读取为整数),并使用相同的语言环境来写入数据。

请注意,您可能没有这样的语言环境,或者如果有,您可能不知道它的名称(并且使用命名的语言环境可能会更改您不想更改的其他内容);在我的机器上,根据编译器(或者我从中调用它的 shell) , imbueing with 的行为会有所不同——如果你有严格的格式要求,你永远不应该使用语言环境。(语言环境的使用是针对您 希望格式取决于用户环境规范的情况。)""""""

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

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"区域设置,仅更改分组。)

于 2013-07-08T15:33:22.370 回答