舊標題:將沒有“e”的科學記數法字串轉換為 Python 中的浮點數
我使用的程式允許一些......奇怪的格式。實數的一種格式是不帶字母字符“E”的科學記數法。例如,“-1.67E-6”可以寫成“-1.67-6”。顯然, float() 不喜歡這樣。我正在撰寫許多需要在多個欄位中進行相同檢查的類,因此我需要一個函式來干凈利落地執行此操作。有沒有辦法覆寫 float() 的內置定義,以便它可以處理這種格式?我認為這是理想的,但我不確定是否可能。
我目前的解決方法是使用我自己的 string-to-float 函式,如下所示。
str2float(s):
if re.search(r'([- ][0-9]*.[0-9]*)([- ][0-9]*)', s):
base, exp = re.findall(r'([- ][0-9]*.[0-9]*)([- ][0-9]*)', X1)[0]
s = f'{base}E{exp}'
return float(s)
uj5u.com熱心網友回復:
這樣的事情怎么樣?
def str2float(s):
sign = ' ' if ' ' in s else '-'
l = s.split(sign)
if (len(l) == 3) and (l[0] == ''):
return float(sign l[1] "E" sign l[2])
elif (len(l) == 2) and (l[0] != ''):
return float(l[0] "E" sign l[1])
else:
return float(s)
str2float("-1.67 6") # -1670000.0
str2float("-1.67-6") # 1.67e-06
str2float("1.67 6") # 1670000.0
str2float("1.67") # 1.67
str2float("-1.67") # -1.67
uj5u.com熱心網友回復:
您可以采用re.sub一種同時考慮當前有效科學記數法的方式。
import re
def str_to_float(s: str) -> float:
s = re.sub(r'(?<=\d)-(?=\d)', 'E-', s)
s = re.sub(r'(?<=\d)\ (?=\d)', 'E', s)
return float(s)
print(str_to_float('-1.67E-6')) # -1.67e-06
print(str_to_float('-1.67-6')) # -1.67e-06
print(str_to_float('1.67 6')) # 1670000.0
print(str_to_float('1.67E6')) # 1670000.0
print(str_to_float('-1.67')) # -1.67
print(str_to_float('1.67')) # 1.67
(?<=\d) - 單個數字(0 到 9)的正向后視。
-和\ - 匹配字符-和 字面意思。
(?=\d) - 單個數字(0 到 9)的正向預測。
這將定位無效的科學記數法(如float所見)并用有效的科學記數法替換它們。
uj5u.com熱心網友回復:
我想我已經找到了我要找的東西。
class float(float):
def __new__(cls, s):
if re.search(r'([- ]?[0-9]*.[0-9]*)([- ][0-9]*)', s):
base, exp = re.findall(r'([- ]?[0-9]*.[0-9]*)([- ][0-9]*)', s)[0]
s = f'{base}E{exp}'
return super(float, cls).__new__(cls, s)
這似乎讓我能夠以我想要的方式超越基本行為float()。這是一個好主意嗎?餿主意?為什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383179.html
