【问题标题】:Nicely formatting numbers in C++ [duplicate]在 C++ 中很好地格式化数字 [重复]
【发布时间】:2013-04-04 15:37:05
【问题描述】:

在 Ada 中,可以写下划线来分隔数字,这大大提高了可读性。例如:1_000_000(相当于 1000000) C++有类似的方法吗?

编辑:这是关于源代码的问题,而不是 I/O。

【问题讨论】:

  • 我认为没有内置功能。可能,您必须编写自己的函数才能做到这一点。
  • 那个问题(“在源代码中表示大数字以提高可读性?”)对我来说没有答案 - 它使用的是 boost 或 C++ 11 功能。

标签: c++


【解决方案1】:

从 C++14 开始,您可以将' 用作digit group separator

auto one_m = 1'000'000;

以前的 C++ 版本本身不支持此功能。有两种主要的解决方法:

【讨论】:

  • 由于我无法使用 C++ 11 功能,我将接受这个答案(尽管我喜欢使用自定义文字的解决方案)。宏解决方案相当不错。
【解决方案2】:

目前没有办法做到这一点。然而,有人提议引入digit seperators (N3499)。不过,他们还没有选择要使用哪个字符作为分隔符。目前的建议是:

  • 空格:4 815 162 342
  • 重音:4`815`162`342
  • 单引号:4'815'162'342
  • 下划线:4_815_162_342

不幸的是,他们都有提案中描述的问题。

您可以通过使用用户定义的文字来采取 hacky 方法:

long long operator "" _s(const char* cstr, size_t) 
{
    std::string str(cstr);
    str.erase(std::remove(str.begin(), str.end(), ','), str.end());
    return std::stoll(str);
}

int main()
{
    std::cout << "4,815,162,342"_s << std::endl;
}

这将打印出来:

4815162342

它只是从给定的文字中删除所有逗号并将其转换为整数。

【讨论】:

    【解决方案3】:
    int main()
    {
       int x = 1e6;
    }
    

    【讨论】:

    • 那么像:0x40000000C00000D 呢?
    • 使用科学记数法我可以很好地用十进制写大数字,但非十进制数字需要不同的解决方案。
    • 确实如此。为此,您可以在下面用管道写评论。
    【解决方案4】:

    你总是可以定义一个可变参数宏,就像N(123,456,678)一样使用。不过,这比它的价值要麻烦得多。特别是,您可能必须解决一些可视化 c++ 特性,以便为可移植代码计算参数。

    【讨论】:

      【解决方案5】:

      通过imbue()使用适当的语言环境方面(在本例中为num_put)对 I/O 流进行处理,您所寻找的完全可能。

      (这是假设您谈论的是 I/O。如果您谈论的是源本身,那么从 C++11 开始这是不可能的。)

      【讨论】:

      • 我认为问题是关于源代码,而不是 i/O
      • @Cheersandhth.-Alf:二读时,我认为你是对的。再说一次,你不应该在你的源代码中使用数字常量(很多)。 ;-) 我将按原样保留这个答案,因为问题和标题都不是很清楚(其他人可能实际上会寻找 I/O 格式)。
      • @DevSolar 当我不得不在手写 0x40000000 3 次或更多次之间做出选择时,我宁愿将其声明为常量并使用它。除此之外,很难发现所有这些零中缺少(或多余)的零。
      • @darkeskhan:是的,当然你声明它为常量once 并使用常量。因此,您必须一次确保正确的零个数。 (也许通过上面的对齐注释指示数字的数量?或者使用1 &lt;&lt; 30 代替?)我确实知道你来自哪里,而且我的cmets认为缺少数字分隔符并不是那么痛苦仅仅是我对此事的个人看法。
      • @darkestkhan:至于您的编辑,我确实意思是“截至”。通过用户提供的代码将带有分隔符的字符串文字转换为整数与编写带有分隔符的整数文字恕我直言。
      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      相关资源
      最近更新 更多