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

时间:2013-07-02 09:42:21

标签: c++ string integer std

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

4 个答案:

答案 0 :(得分:2)

您可以使用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 :(得分:2)

  

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

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

int n = 1E3;

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

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

答案 2 :(得分:0)

将指数表示法发送到std::stoi会过于频繁地溢出,而C ++中的整数溢出是未定义的行为。

您需要建立自己的地方,以便根据您的具体要求制定边缘案例。

我倾向于不沿std::stod路线前进,因为如果double的整数部分不能,intdouble的演员阵容是未定义的行为由int表示。

答案 3 :(得分:0)

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

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

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