在c++中很好地格式化数字

Nicely formatting numbers in C++

本文关键字:格式化 数字 很好 c++      更新时间:2023-10-16

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

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

从c++ 14开始,您可以使用'作为数字组分隔符:

auto one_m = 1'000'000;

以前版本的c++本身不支持此操作。有两种主要的解决方法:

  • 在c++ 11中使用用户定义字面值;这将允许您编写如下代码:

    auto x = "1_000_000"_i;
    

    (将此写入constexpr会更棘手-但绝对可能。)

  • 使用一个简单的宏,它将允许以下代码:

      auto x = NUM(1,000,000);
    

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

  • Space: 4 815 162 342
  • 重调:4`815`162`342
  • 单引号:4'815'162'342
  • 下划线:4_815_162_342

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

你可以使用一个用户定义的文字:

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

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

int main()
{
   int x = 1e6;
}

您总是可以定义一个可变宏,如N(123,456,678)。不过这有点太麻烦了。特别是,对于计算参数的可移植代码,您可能需要解决一些visual c++的特性。

您所寻找的完全可以通过使用适当的区域设置facet(在本例中为num_put) imbue() I/O流来实现。

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