在c++中很好地格式化数字
Nicely formatting numbers in C++
在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开始,这是不可能的。)
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 使用 std::locale 格式化法语数字时无效的 UTF-8 数据
- 如何在C++中格式化数字
- 在小数秒内仅用 3 位数字格式化 posix 时间
- 将数字转换为格式化字符串,然后再次分析格式化字符串
- 在没有科学记数法的c++中格式化有效数字
- 格式化带符号十六进制数字的输出
- 如何使用stringstream格式化十六进制数字
- 一个数字和字段宽度的格式化输出,C++标准在哪里说明它
- Stringstream将unsigned long转换为带逗号的格式化数字字符串
- 在c++中很好地格式化数字
- 需要帮助格式化数字c++
- C++格式化int数字,用一个点分隔数千
- 防止像这样格式化大数字"24.000.000"
- 格式化的天气.TextCtrl只有数字值-浮点精度