是否有任何Python库可以帮助解析和验证数字字符串超出内置float()函数支持的范围?例如,除了简单数字(1234.56)和科学记数法(3.2e15)之外,我希望能够解析如下格式:
我做了一些搜索但找不到任何东西,但如果这样的图书库还不存在我会感到惊讶。
答案 0 :(得分:6)
如果要转换“本地化”数字,例如美国“2,147,483,647”表单,可以使用locale模块中的atof()
函数。例如:
import locale
locale.setlocale(locale.LC_NUMERIC, 'en_US')
print locale.atof('1,234,456.23') # Prints 1234456.23
对于分数,Python现在直接处理它们(从2.6版开始);它们甚至可以用字符串构建:
from fractions import Fraction
x = Fraction('1/4')
print float(x) # 0.25
因此,只有借助上述两个标准模块,您才能解析前面提到的任何一种方式编写的数字:
try:
num = float(num_str)
except ValueError:
try:
num = locale.atof(num_str)
except ValueError:
try:
num = float(Fraction(num_str))
except ValueError:
raise Exception("Cannot parse '%s'" % num_str) # Or handle '42 billion' here
# 'num' has the numerical value of 'num_str', here.
答案 1 :(得分:1)
在pyparsing中构建一个应该非常简单 - 事实上,其中一个教程pyparsing项目中的一些(this page上的wordsToNum.py
)已经完成了一些。你说的是那些没有真正标准化表达的东西(ISO 8602意义上的标准,而不是“每个人都知道的”标准),所以很容易就是没有人完成你正在寻找的东西对
答案 2 :(得分:0)
我没有听说过一个。你知道任何其他语言的图书馆吗?这样你就可以利用他们的文档和测试。
如果你找不到一个,写一堆测试用例,那么我们可以帮你填写解析代码。
Google必须拥有一个,尝试搜索55亿* 10,但我认为他们没有开源这样的东西。根据您的使用方式,您可以使用Google进行一些工作;)
答案 3 :(得分:0)
babel支持第一种情况(带逗号的i18n号码)。文件:http://babel.edgewall.org/wiki/ApiDocs/babel.numbers。
支持简单的命名数字不应该太难以自己编码,与分数相同。