回答
standard library function strtod
处理指数组件很好(atof
也是如此,但strtod
允许区分失败的解析和解析零值)。
,将起到很好的将是一个正则表达式:
-?[\d.]+(?:e-?\d+)?
转换为数字可以做这样的:String in scientific notation C++ to double conversion,我猜。
正则表达式是
-? # an optional -
[\d.]+ # a series of digits or dots (see *1)
(?: # start non capturing group
e # "e"
-? # an optional -
\d+ # digits
)? # end non-capturing group, make optional
** 1)这是不是100%正确,在技术上只能有一个点,在此之前它只有一个(或没有)的数字。但实际上,这不应该发生。所以正则表达式是一个很好的近似值,误报应该是不太可能的。随意使正则表达式更具体。*
您可以使用:-?\d*\.?\d+e[+-]?\d+
正则表达式来识别科学值。
请不要使用'{0,1}'-use'?'。前者更长,更清晰,并且具有相同的效果。 – 2010-12-18 18:39:58
'{0,1}'可以替换为'?'。但是,为什么你要小数点是可选的?这不允许负数。它也错误地匹配可能不希望的'.0'。 – marcog 2010-12-18 18:41:02
@marcog:可能是因为根据示例数据,小数点是可选的。第三场只是“1”。 – 2010-12-18 18:45:07
如果你能肯定的是,双格式是科学的,你可以尝试类似如下:
string inp("8.67548e-017");
istringstream str(inp);
double v;
str >> scientific >> v;
cout << "v: " << v << endl;
如果要检测是否有该格式的浮点数,然后上面的正则表达式可以解决这个问题。
编辑:其实不需要scientific
手,当你在双流,它会自动为你做的处理(无论是固定的或科学)
我认为这是去C++的方式。摆弄有时候工作正常的正则表达式,有时不会成为我理想的方式。相反,这将粗糙的部分委托给stl的stringstream。这是检查有效科学格式的更高级版本。 – 2015-04-10 20:04:05
嗯,这不是正是你问什么,因为它不是Perl(gak),它是一个常规定义,不是一个正则表达式,但它是我用来识别C浮点文字的扩展名(该扩展名允许在数字字符串中使用“_”),我确定你可以将它转换成不可读的正则表达式,如果你想:
/* floats: Follows ISO C89, except that we allow underscores */
let decimal_string = digit (underscore? digit) *
let hexadecimal_string = hexdigit (underscore? hexdigit) *
let decimal_fractional_constant =
decimal_string '.' decimal_string?
| '.' decimal_string
let hexadecimal_fractional_constant =
("0x" |"0X")
(hexadecimal_string '.' hexadecimal_string?
| '.' hexadecimal_string)
let decimal_exponent = ('E'|'e') ('+'|'-')? decimal_string
let binary_exponent = ('P'|'p') ('+'|'-')? decimal_string
let floating_suffix = 'L' | 'l' | 'F' | 'f' | 'D' | 'd'
let floating_literal =
(
decimal_fractional_constant decimal_exponent? |
hexadecimal_fractional_constant binary_exponent?
)
floating_suffix?
C格式是专为编程langu年龄不是数据,所以它可能支持你的输入不需要的东西。
我尝试了一些其他解决方案无济于事,所以我想出了这个。
^(-?\d+)\.?\d+(e-|e\+|e|\d+)\d+$
凡是符合被认为是有效的科学记数法。
请注意:此接受e+
,e-
和e
;如果你不想接受e
,使用此:^(-?\d+)\.?\d+(e-|e\+|\d+)\d+$
我不知道这是否适用于C++,但在C#中,您可以在正则表达式的^
和(-
之间添加(?i)
,切换在线不区分大小写。没有它,像1.05E+10
这样宣布的指数将无法被识别。
编辑:我以前的正则表达式是一个小错误,所以我用上面的代码替换了它。
- 1. 数学正则表达式表达
- 2. 数学与mod_rewrite的正则表达式
- 3. 使用正则表达式和数学
- 4. Java科学计算器正则表达式
- 5. 正在计数的正则表达式
- 6. 使用正则表达式解析数学表达式
- 7. Python数学正则表达式
- 8. 正则表达式:数学与编程
- 9. MySQL的正则表达式计数
- 10. Javascript正则表达式,适用于六位数的base36数字
- 11. 正则表达式的数字模式
- 12. 正则表达式使用python re模块的分数数学表达式
- 13. 正则表达式的字母数字
- 14. 字母数字的正则表达式
- 15. 用于数字格式验证的正则表达式
- 16. 用于匹配数字模式的正则表达式
- 17. 用于非字母和非数字的正则表达式
- 18. 正则表达式来验证练成像数学表达式
- 19. 数字的正则表达式?
- 20. 正则表达式的数字
- 21. 只有数字的正则表达式
- 22. 正则表达式的数字范围
- 23. Mysql的正则表达式数字
- 24. 正则表达式的数字
- 25. CSV与数字的正则表达式
- 26. 十位数字的正则表达式
- 27. 数字之间的正则表达式
- 28. 正则表达式的数字+%+ gw
- 29. 获取数字的正则表达式
- 30. 字母+数值的正则表达式
我建议将'[d。] +'上移到'\ d + \。\ d +'以防止错误匹配。如果在小数点之前和/或之后不需要数字,则使用'\ d *'。 – marcog 2010-12-18 18:38:59
IS不会匹配'5.5.5.5.5.5.5.5.5.5.5.5.5' – 2010-12-18 18:39:48
@Martin:是的。问题是:这样的价值可能会发生吗?如果是的话,正则表达式可以很容易地做出更具体的。我的猜测是,在这种情况下'5.5.5.5'的情况是不太可能的。 – Tomalak 2010-12-18 18:43:19