从字符串中以指数表示法解析整数

Posted

技术标签:

【中文标题】从字符串中以指数表示法解析整数【英文标题】:parsing integer in exponential notation from string 【发布时间】:2013-07-02 09:42:20 【问题描述】:

显然std::stoi 不接受以指数表示法表示整数的字符串,例如"1e3" (= 1000)。有没有一种简单的方法可以将这样的字符串解析为整数?有人会认为,由于这种表示法在 C++ 源代码中有效,标准库有一种方法来解析它。

【问题讨论】:

【参考方案1】:

您可以使用stod(参见docs)来执行此操作,首先将其解析为双精度。 在回退时要注意精度问题...

#include <iostream>   // std::cout
#include <string>     // std::string, std::stod

int main () 
   std::string text ("1e3");
   std::string::size_type sz;     // alias of size_t
   double result = std::stod(text,&sz);
   std::cout << "The result is " << (int)result << std::endl; // outputs 1000
   return 0;
 

【讨论】:

+1 但如果结果的幅度太大,则保留 (int)result 为 UB。 是的,我应该强调这一点。【参考方案2】:

有人会认为,由于这种表示法在 C++ 源代码中有效,标准库有办法解析它。

库和编译器无关。此语法在 C++ 中有效的原因是该语言允许您将 double 类型的表达式分配给整数变量:

int n = 1E3;

double 表达式(即double 类型的数字文字)分配给整数变量。

知道这里发生了什么,您应该能够轻松识别标准 C++ 库中满足您需要的函数。

【讨论】:

【参考方案3】:

例如,您可以使用标准流将其读取为双精度

double d;
std::cin >> d; //will read scientific notation properly

然后将其转换为 int,但显然 double 可以表示比 int 更多的值,所以要小心。

【讨论】:

【参考方案4】:

将指数符号发送到std::stoi 会经常溢出,而 C++ 中的整数溢出是未定义的行为。

您需要自己构建,以便根据您的特定要求定制边缘案例。

我倾向于不走std::stod 路线,因为如果double 的组成部分不能由int 表示,则从doubleint 的转换是未定义的行为。

【讨论】:

以上是关于从字符串中以指数表示法解析整数的主要内容,如果未能解决你的问题,请参考以下文章

字符串格式-方法

任意正整数拆分成2的指数幂(2的N次方)之和表示

如何在javascript中以异步方式解析和字符串化

在 Java 中以不同的格式将字符串解析为日期

Javascript Nan 错误:将字符串解析为整数

JavaScript无法从Java解析用Gson序列化的字符串[重复]