是否有任何Python庫可幫助解析和驗證超出內置float()函數支持的數字字符串?例如,除了簡單的數字(1234.56)和科學記數法(3.2e15),我希望能夠解析格式,如:Python中靈活的數字字符串解析
- 編號之間用逗號:2,147,483,647
- 命名大數5.5十億
- 分數:1/4
我做了一些搜索和找不到任何東西,但如果這樣的庫確實不存在我會感到很驚訝。
是否有任何Python庫可幫助解析和驗證超出內置float()函數支持的數字字符串?例如,除了簡單的數字(1234.56)和科學記數法(3.2e15),我希望能夠解析格式,如:Python中靈活的數字字符串解析
我做了一些搜索和找不到任何東西,但如果這樣的庫確實不存在我會感到很驚訝。
如果要轉換「本地化」數字(如美國的「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
因此,你可以解析用任何你提到的第3種方式的數字,僅上述兩個標準模塊的幫助:
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.
我還沒有聽說過一個。你知道任何其他語言的這樣的圖書館嗎?這樣你可以利用他們的文檔和測試。
如果你找不到一個,寫一堆測試用例,那麼我們可以幫你填寫解析代碼。
谷歌必須有一個,嘗試搜索55億* 10,但我不認爲他們已經開源此類。取決於你需要如何使用它,你可能可以使用谷歌做一些工作;)
在pyparsing中構建一個應該是非常簡單的 - 事實上,其中一個教程pyparsing項目做了一些這個(wordsToNum.py
在this page)已經做了一些。你在談論的東西實際上並沒有標準的表示(ISO 8602標準,而不是「每個人都知道的」意義上的標準),所以很容易就沒有人按照你想要的來做對於。
babel支持第一種情況(國際編號帶逗號)。文檔:http://babel.edgewall.org/wiki/ApiDocs/babel.numbers。
支持簡單的命名數字不應該太難以自己編碼,與分數相同。
這是一個有點偏題: 前兩點受到國際和語法分析模糊不清:在歐洲「,」代表分數和億美元不一樣,美國億美元。 但是我認爲,如果輸入是結構化的,它們很容易實現。 最後一點受到浮點四捨五入的影響。您可以使用sympy類來存儲小數值,或者您可以推出自己的類。如果您不需要擁有許多操作/操作符,則可能更容易製作自己的類。 – Anycorn 2009-12-07 06:31:48