首页 > 解决方案 > 将浮点数格式化为带有可选小数点的有限大小的 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++formattingc++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;
}

注意:我没有检查错误,因为

最小和最大值钳位以防止真正超出范围的数字在此问题的外部处理。


推荐阅读