簡體   English   中英

如何將字符串轉換為int或float優先級為int?

[英]How can I convert a string to either int or float with priority on int?

當我想要這個時,我找不到另一個答案,所以我想我會為其他人發布我自己的解決方案,如果我做錯了也會得到更正。

我必須創建一個自動配置文件解析器,如果可能的話我更喜歡使用int,如果不是,我會浮動。 通常的try / except轉換本身不起作用,因為任何float都只會被強制轉換為int。

為了澄清有人問,案例基本上是將數字轉換為編寫配置文件數據的人。 所以帶小數的任何東西都可能是浮點數。 另外,由於浮點數的性質,我認為float對於某些運算符(例如==,<,>)可能是危險的,並且int將在必要時轉換為float。 因此,我希望數字盡可能保持在int中。 這不是一件大事,只是對我自己的一種約定。

def int_or_float(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

如果你想要像"10.0000"這樣的東西轉換為int,試試這個:

def int_dammit_else_float(s):
    f = float(s)
    i = int(f)
    return i if i == f else f

您想要輸入"1e25"結果是什么?

def int_float_none(x):
    # it may be already int or float 
    if isinstance(x, (int, float)):
        return x
    # all int like strings can be converted to float so int tries first 
    try:
        return int(x)
    except (TypeError, ValueError):
        pass
    try:
        return float(x)
    except (TypeError, ValueError):
        return None

對於傳遞的任何對象,上面的函數將返回int或float轉換或None。

這是一次,獲得許可可能比先后請求寬恕更好,這通常被認為是“Pythonic”做事的方式,通常涉及try/except 所以像這樣簡單的東西可能足夠好:

v = float(s) if '.' in s or 'e' in s.lower() else int(s) 

由於有多個字符可以表示浮點數,您還可以通過其他方式檢查其中一個:

import re
pattern = re.compile(r'[.eE]')
v = float(s) if pattern.findall(s) else int(s)

要么

chars = set('.eE')
v = float(s) if any((c in chars) for c in s) else int(s)

最后,在一個稍微不同的軌道上,如果你想要浮點整數成為整數,你可以執行以下操作,這類似於_dammit_ Machin的“ _dammit_ ”函數:

v = int(float(s)) if int(float(s)) == float(s) else float(s)

的eval(S)

eval()是一個接受字符串並將其作為Python代碼處理的函數。 當任何類型的文字作為字符串給出時,它將返回包含該值的Python對象。

但是,從安全角度來看,這是一個壞主意,因為有人可能會提供崩潰或篡改程序的指令。 在處理之前,您可以要求它是一組特定的字符,即:

eval(s) if not set(s).difference('0123456789.') else None

不過,這仍然不值得頭疼。 也就是說,你可以得到花哨,並允許表達式計算......這可能值得嘗試!

num = lambda s: eval(s) if not set(s).difference('0123456789. *+-/e') else None

>>> num('10')
10
>>> num('10.0')
10.0
>>> num('1e3')
1000.0
>>> num('4.8 * 10**34')
4.8e+34
>>> num('1+2/3')
1.6666666666666665

嘗試檢測浮點並不容易,但檢測可能的整數更容易。

我會嘗試檢查字符串是否只包含數字(忽略可能的前導空格或符號)並相應地轉換為float或integer:

lst = ['1' , '2.2' , ' -3','+5']

result = [int(x) if x.lstrip(" -+").isdigit() else float(x) for x in lst]

print(result)

打印:

[1, 2.2, -3, 5]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM