C++ 将浮点数格式化为具有可选小数点的有限大小的字符数组

C++ 将浮点数格式化为具有可选小数点的有限大小的字符数组,c++,formatting,c++17,C++,Formatting,C++17,我需要把浮点数打印成固定的字符数。这在严格基于文本的数据协议中使用(是的,我知道)。小数包含在字符计数中。忽略空终止符。没有最小填充要求。十进制精度可以是0到(缓冲区大小-2),而实数的最大数量可以是0到缓冲区大小。最小值和最大值夹紧以防止真正超出范围的数字从外部处理此问题 假设缓冲区大小为6,最小值和最大值为(0.0001和999999)的示例: 起初的 缓冲区(6个字符) 笔记 12445.11897784 12445 只保留5个数字,因为没有小数+值的空间 8846.51548 8846.

我需要把浮点数打印成固定的字符数。这在严格基于文本的数据协议中使用(是的,我知道)。小数包含在字符计数中。忽略空终止符。没有最小填充要求。十进制精度可以是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也可以接受
看起来很简单:

  • 如果数字大于10000
  • 正常打印,无数字
    %.0f
  • 如果一个数字大于1000
  • 用逗号后的一位数字打印
    %.1f
  • 如果一个数字大于100
  • 用逗号后的两位数字打印
    %.2f
  • 如果一个数字大于10 2.用逗号后的3位数字打印
    %.3f
  • 如果。。。1.
  • <代码>%.4f
  • 否则
  • %.5f
  • 删除前导零
  • 小心四舍五入!例如,数字9.999999低于10,但将打印为10.000。因此:

  • 首先以所需的最大精度将数字打印成字符串-
    %.5f
  • 然后计算结果字符串中逗号前面的数字
  • 然后“如果一个数字大于100”对逗号前的位数进行上述比较,而不是对实际数字进行比较
  • 将字符串修剪为逗号后所需的位数

  • < P> C++。在打印后,在字符串中正确地舍入数字,而不是在打印之前,这样就可以防止在转换为字符串时改变任何数量的字符串。

    < P>这里是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;
    }
    
    #包括
    #包括
    标准::字符串到6(浮点f){
    std::字符串s;
    s、 调整大小(10);
    自动ec=std::to_字符(s.data(),s.data()+s.size(),f,std::chars_格式::固定);
    s、 调整大小(6);
    如果(s.back()=='。)
    s、 调整大小(5);
    返回s;
    }
    int main()
    {
    
    STD::代码< >我理解不完整?<代码>什么是你的理解?考虑代码> SNPrTNFF <代码> >代码> C++ 17中的任何实用工具< /代码>你是在寻找实用程序还是想解决你的问题?