c++ - 将浮点数格式化为带有可选小数点的有限大小的 char 数组
问题描述
我需要将浮点数打印为固定数量的字符。这用于严格基于文本的数据协议(是的,我知道)。十进制包含在字符数中。忽略空终止符。没有最小填充要求。十进制精度可以是 0 到(缓冲区大小 - 2),而最大实数可以是 0 到缓冲区大小。最小和最大值钳位以防止真正超出范围的数字在此问题的外部处理。
假设缓冲区大小为 6 且强制最小值和最大值为(0.0001 和 999999)的示例:
原来的 | 缓冲区(6 个字符) | 笔记 |
---|---|---|
12445.11897784 | 12445 | 只保留 5 位,因为没有十进制 + 值的空间 |
8846.51548 | 8846.5 | |
4.54631888315 | 4.5463 | |
7651 | 7651 | |
0.87457 | .87457 | 0.8746 也是可以接受的 |
我最初认为 sprintf 和 %.6G 似乎可以工作,直到我意识到它没有将小数点作为字符考虑在内。我的理解不完整吗?
是否有任何 C++17 或更低版本的实用程序可以用来完成上述操作。我也愿意考虑将或已经成为高于 c++17 版本标准的一部分的库。
解决方案
这是 C++ 17 版本:
#include <iostream>
#include <charconv>
std::string to6(float f) {
std::string s;
s.resize(10);
auto ec = std::to_chars(s.data(), s.data() + s.size(), f, std::chars_format::fixed);
s.resize(6);
if (s.back() == '.')
s.resize(5);
return s;
}
int main()
{
std::cout << to6(12445.11897784) << std::endl;
std::cout << to6(8846.51548) << std::endl;
std::cout << to6(4.54631888315) << std::endl;
std::cout << to6(7651) << std::endl;
std::cout << to6(0.87457) << std::endl;
return 0;
}
注意:我没有检查错误,因为
最小和最大值钳位以防止真正超出范围的数字在此问题的外部处理。
推荐阅读
- windows - 如何解决 Windows 服务自动启动失败的问题
- swift - 如何在 Swift 中创建快速排序实现?
- jsf-2 - jsf webapp on websphere v9.0部署问题
- c# - 使用 connString 附加(或不附加).mdf 文件到 SQLEXPRESS 17
- c# - 将列表转换为数据表以在存储过程中传递表类型
- matlab - Simulink Mask 初始化命令和 RuntimeObject
- istio - 如何将 3rd 方证书颁发机构从秘密中添加到 Istio 的 Citadel?
- facebook - React-native facebook登录显示黑屏/白屏
- python - 如何使用元组对列表进行切片?
- go - 有没有办法在 Go 中使用动态类型切片?