C 11 std::to_string(double) - 没有尾随零

新手上路,请多包涵

今天试用了C++11 STL的一些新功能,遇到了 std::to_string

可爱,可爱的一组功能。只为一次双字符串转换创建一个字符串流对象对我来说似乎有点过头了,所以我很高兴我们现在可以做这样的事情:

 std::cout << std::to_string(0.33) << std::endl;

结果?

 0.330000

我对此并不完全满意。有没有办法告诉 std::to_string 省略尾随零?我搜索了互联网,但据我所知,该函数只接受一个参数(要转换的值)。回到使用字符串流的“过去”,您可以设置流的宽度,但我宁愿不转换回来。

有人遇到过这个问题/有解决方案吗?一些 StackOverflow 搜索一无所获。

(C++11 STL 参考: http ://en.cppreference.com/w/cpp/string/basic_string/to_string)

原文由 Stijn Frishert 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 968
2 个回答

C++11 标准明确表示( 21.5/7 ):

返回:每个函数都返回一个字符串对象,该对象保存其参数值的字符表示形式,该参数值将通过使用格式说明符“%d”、“%u”、“%ld”调用 sprintf(buf, fmt, val) 生成”、”%lu”、”%lld”、”%llu”、”%f”、”%f” 或 “%Lf”,其中 buf 指定足够大小的内部字符缓冲区

对于按此顺序声明的函数:

 string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);

因此,您无法控制结果字符串的格式。

原文由 rubenvb 发布,翻译遵循 CC BY-SA 3.0 许可协议

有了 C++20,我们终于可以拥抱 std::format 的力量!让我们希望 GCC 和 Clang 能够赶上 MSVC 并尽快实现它。

 std::cout << std::format("{}\n", 0.33);

原文由 303 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题