【问题标题】:float <-> std::string conversion alternative?float <-> std::string 转换替代方案?
【发布时间】:2011-09-25 21:00:13
【问题描述】:

atofstrtodlexical_caststringstreamsprintf 有什么替代品吗?

即:

  1. C++ 方式(std::string 而不是char*
  2. 安全(无缓冲区溢出风险)
  3. 有效(如果无法进行转换,则返回 NaN)
  4. 没有外部库(独立)

我更喜欢this,一个简单的函数,经过优化,切中要害

原因:

  • atofstrtod 是 C 函数,它们在失败时不会返回 NaN,我更喜欢在 std::string 上工作,所以我只是问是否有人已经为 std::string 编写了一些我可以使用的包装器(如果你别介意)。
  • lexical_cast 有 boost 依赖
  • stringstream 很慢
  • sprintf 存在缓冲区溢出风险及其 C 函数

【问题讨论】:

  • 我建议您添加一些理由来说明您排除标准方法的原因。当您任意丢弃所有最好的建议时,给出建议是没有意义的(知道您可以将atof 包装在一个std::string 友好的函数中。
  • 您正在将浮点数转换为字符串并且您担心性能?你有什么应用程序——应用程序,而不是综合基准——你甚至可以注意到 stringsteam 是“慢”的?
  • 我正在编写一个库(或包装器),以便它可以用于任何事情,而且它的综合基准测试速度很慢。
  • strtod(string.c_str(), NULL)asprintf 如何避免缓冲区溢出?公平地说,如果 C 函数解决了您的问题,我找不到任何真正的、充分的理由来避免使用 C++ 中的 C 函数。
  • @zneak:如果转换不成功,它不会返回 NaN

标签: c++ string stl floating-point


【解决方案1】:

我会看看 Boost Spirit

至少格式化程序的基准(即浮点 -> 字符串)始终如一地证明是最重要的*1*

还可以使用策略类很好地配置解析时的确切输入格式规范和语义。


这是我对 qi::any_real_parser 的绝对最小依赖使用及其涉及的依赖列表:

#include <boost/spirit/include/qi_real.hpp>

namespace qi = boost::spirit::qi;

int main()
{
    const char input[] = "3.1415926";
    const char *f(input);
    const char *l(f+strlen(input));

    qi::any_real_parser<double> x;
    double parsed;
    x.parse(f, l, qi::unused, qi::unused, parsed);

    return 0;
}

  • 提升/概念
  • 提升/配置
  • 提升/细节
  • 提升/异常
  • 增强/融合
  • 提升/迭代器
  • 提升/数学
  • 升压/放大
  • 增强/可选
  • 升压/预处理器
  • 升压/原型
  • 提升/范围
  • 升压/正则表达式
  • 提升/精神
  • 提升/类型
  • 提升/type_traits
  • 提升/实用性
  • 提升/变体

aligned_storage.hpp,assert.hpp,blank_fwd.hpp,blank.hpp,call_traits.hpp,checked_delete.hpp,concept_check.hpp,config.hpp,cstdint.hpp,current_function.hpp,foreach_fwd.hpp,foreach.hpp ,get_pointer.hpp,implicit_cast.hpp,iterator.hpp,limits.hpp,math_fwd.hpp,next_prior.hpp,noncopyable.hpp,none.hpp,none_t.hpp,optional.hpp,ref.hpp,static_assert.hpp,swap .hpp,throw_exception.hpp,type.hpp,utility.hpp,variant.hpp,version.hpp

1 例如http://www.boost.org/doc/libs/1_47_0/libs/spirit/doc/html/spirit/karma/performance_measurements/numeric_performance/double_performance.html

【讨论】:

  • 我可以在不依赖boost的情况下使用它吗?
  • 什么是 boost 依赖?显然,您需要 boost/spirit/include/qi.hpp。但它只是标题。它可能会带来一些 mpl 和 fusion。因此,如果您是这个意思,那么您当然不能没有它。
  • @uray:我不明白 boost 依赖的问题。假设您想出了另一个库 Q 可以满足您的要求,那么显然您将依赖库 Q。您已经列举了标准库中可用的所有选项。如果问题是 boost 太大,可以使用一些工具来提取您需要的部分。 (例如bcp
  • 我只是在寻求替代方案,并且我不希望向我的库中添加另一个依赖库,如果没有替代方案,我可以使用 boost 或只是为现有标准库创建自己的包装
  • 在这种情况下,自己动手或使用 strtod :)
【解决方案2】:

如果您想从数字类型转换为 std::string,最新标准中有一个 std::to_string 函数。

不幸的是,正如我最近发现的那样,在 Visual Studio 2010 中它受到了一些限制,因为它只有三个重载可用; long double、long long 和 unsigned long long。这会在尝试从模板中使用它们时导致问题。

【讨论】:

    【解决方案3】:

    fast format 库应该能够进行您正在寻找的各种转换,至少可以编写一个浮点数。但是,它不处理浮点数的解析。

    【讨论】:

    • Erm... 它不处理浮点数的解析 :_) 我也查看了那个库,因为我希望现在他们已经支持了。没有骰子
    • @sehe:我在回答中确实注意到了这一点。
    • 没关系,我不知何故错过了他也想要格式化的事实。我也应该把链接放进去:)
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多