在 C++ 中使用 boost::lexical_cast 将双精度转换为字符串?

Posted

技术标签:

【中文标题】在 C++ 中使用 boost::lexical_cast 将双精度转换为字符串?【英文标题】:Convert double to string using boost::lexical_cast in C++? 【发布时间】:2011-02-16 12:34:24 【问题描述】:

我想使用lexical_cast 将浮点数转换为字符串。通常它工作正常,但我对没有小数的数字有一些问题。如何修复字符串中显示的小数位数?

例子:

double n=5;
string number;
number = boost::lexical_cast<string>(n);

结果编号是5,我需要编号5.00

【问题讨论】:

【参考方案1】:

来自boost lexical_cast 的文档:

对于更多涉及的转换,例如精度或格式需要比 lexical_cast 的默认行为提供的更严格的控制,建议使用传统的字符串流方法。如果转换是数字到数字,则 numeric_cast 可能提供比 lexical_cast 更合理的行为。

例子:

#include <sstream>
#include <iomanip>

int main() 
    std::ostringstream ss;
    double x = 5;
    ss << std::fixed << std::setprecision(2);
    ss << x;
    std::string s = ss.str();
    return 0;

【讨论】:

【参考方案2】:

看看 boost::format 库。它将 printf 的可用性与流的类型安全性结合在一起。至于速度,我不知道,但我怀疑它现在真的很重要。

#include <boost/format.hpp>
#include <iostream>

int main()

   double x = 5.0;
   std::cout << boost::str(boost::format("%.2f") % x) << '\n';

【讨论】:

【参考方案3】:

如果您需要复杂的格式,请改用std::ostringstreamboost::lexical_cast 用于“简单格式”

std::string
get_formatted_value(double d) 
    std::ostringstream oss;
    oss.setprecision(3);
    oss.setf(std::ostringstream::showpoint);
    oss << d;
    return oss.str();

【讨论】:

【参考方案4】:

你也可以使用 sprintf,它比 ostringstream 更快

#include <cstdio>
#include <string>

using namespace std;

int main()

    double n = 5.0;

    char str_tmp[50];
    sprintf(str_tmp, "%.2f", n); 
    string number(str_tmp);

【讨论】:

我想你的意思是 snprintf :) 不要使用using namespace std;

以上是关于在 C++ 中使用 boost::lexical_cast 将双精度转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

boost::lexical_cast<> 的语言环境不变保证

boost::lexical_cast int 用零填充字符串

Ubuntu14.04下安装 boost (boost_1.54 最简单的方法)

如何包含Boost库?

static_cast 与 boost::lexical_cast

用boost::lexical_cast进行数值转换