将浮点数转换为格式化字符串

发布于 12-09 04:10 字数 563 浏览 1 评论 0原文

我正在尝试将 double 数字转换为 std::string,转换应以带有 2 位十进制数字的十进制格式或指数形式打印:

  1. 1 -> 1.00
  2. 0.1 -> 0.10
  3. 0.01→ 0.01
  4. 0.015 --> 1.5e-2
  5. 10→ 10.00
  6. 100 -> 10.00 100 -> 100.00
  7. 15000 --> 1.5e4

我尝试将 boost::format 函数与 %g 类型一起使用,但是虽然可以设置有效位数,但无法设置小数点后打印的位数:

  1. 1 -> 1
  2. 0.1→ 0.1
  3. 0.01→ 0.01
  4. 10-> 10
  5. 100 -> 10 100 100

有没有更好的方法来进行这种转换/格式化?我更喜欢使用标准库或 Boost。

I'm trying to convert a double number to a std::string, the conversion should print either in the decimal format with 2 decimal digits or in the exponential form:

  1. 1 -> 1.00
  2. 0.1 -> 0.10
  3. 0.01 -> 0.01
  4. 0.015 -> 1.5e-2
  5. 10 -> 10.00
  6. 100 -> 100.00
  7. 15000 -> 1.5e4

I tried to use the boost::format function with the %g type, but while it is possible to set the number of significant digits, it's not possible to set the number of printed digits after the decimal point:

  1. 1 -> 1
  2. 0.1 -> 0.1
  3. 0.01 -> 0.01
  4. 10 -> 10
  5. 100 -> 100

Is there a better way of doing this kind of conversion/formatting? I would preferably use the Standard Library or Boost.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

桃气十足2024-12-16 04:10:11

根据数字的大小选择科学固定

就是这么简单。

干杯&呵呵,

Choose scientific or fixed depending on the size of the number.

It's that easy.

Cheers & hth.,

稀香2024-12-16 04:10:11

不需要 boost,尽管如果你愿意的话,应该有办法使用 boost::formatsprintf 来做到这一点。

#include <iostream>
#include <iomanip>

int main()
{
    std::string numStr("3.14159265");
    double num(atof(numStr.c_str()));
    std::cout
        << std::setprecision(2) 
        << std::scientific << num
        << std::fixed << num;
    return 0;
}

编辑:如果您想从double转到std::string,请误读问题,我会使用std::ostringstream 它支持相同的 iostream 操纵器和插入运算符。然后你可以调用str()来从中获取一个字符串。

No boost needed although there should be a way to do this with boost::format or sprintf if you want.

#include <iostream>
#include <iomanip>

int main()
{
    std::string numStr("3.14159265");
    double num(atof(numStr.c_str()));
    std::cout
        << std::setprecision(2) 
        << std::scientific << num
        << std::fixed << num;
    return 0;
}

Edit: Misread the question if you want to go from double to std::string I'd use a std::ostringstream which supports the same iostream manipulators and insertion operator. Then you can call str() to get a string out of it.

眼藏柔2024-12-16 04:10:11

您可以使用 ostringstream,就像这样

#include <sstream>
#include <string>

std::string FloatToString(float fNumber)
{
    std::ostringstream os;

    os << fNumber;

    return os.str();
}

You can use ostringstream, like so

#include <sstream>
#include <string>

std::string FloatToString(float fNumber)
{
    std::ostringstream os;

    os << fNumber;

    return os.str();
}
著墨染雨君画夕2024-12-16 04:10:11

我不确定这是否是您正在寻找的东西,但是......
您可以使用 cout 和 set precision 函数来控制打印的位数。

#include <iomanip>
#include <iostream>
using namespace std;

int main()
{
  double d = 123123.23234234;
  cout << setprecision(15) << d;
  system("pause");
  return 0;
}

I'm not sure if this is what you are looking for but...
You can control the number of printed digits using cout with using the setprecision function.

#include <iomanip>
#include <iostream>
using namespace std;

int main()
{
  double d = 123123.23234234;
  cout << setprecision(15) << d;
  system("pause");
  return 0;
}
携君以终年2024-12-16 04:10:11

sprintf();应该很容易帮助您将 double 打印到 string/char 数组中。

sprintf() ; should be easy to help you print double into a string/char array .

双马尾2024-12-16 04:10:11

普通的旧 C sprintf 支持小数位数,如下所示:“%.3g”

您可以轻松地将 char* 输出转换为 std::string 。

Plain old C sprintf supports # of decimals like so: "%.3g"

You can turn the char* output into a std::string easily enough.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文