type - python turn to integer




如何在Python中將字符串解析為float或int? (15)

在Python中,我怎樣才能解析一個數字字符串像"545.2222"到它相應的浮點值542.2222 ? 或者將字符串"31"解析為一個整數31

我只想知道如何將一個浮點 string解析為一個float ,然後(單獨)將一個int string解析為一個int


在Python中,我怎樣才能解析一個數字字符串像“545.2222”到它相應的浮點值542.2222? 或者將字符串“31”解析為一個整數31? 我只想知道如何將一個浮點字符串解析為一個浮點數,然後(單獨)將一個int字符串解析為一個int。

你要求分開做這件事很好。 如果你將它們混合在一起,你可能會在稍後為自己設置問題。 簡單的答案是:

"545.2222"浮動:

>>> float("545.2222")
545.2222

"31"為整數:

>>> int("31")
31

其他轉換,字符串和文字的字符串轉換:

來自不同基地的轉化,你應該提前知道基地(默認為10)。 請注意,您可以使用Python針對其文字(參見下文)所期望的內容為其添加前綴或刪除前綴:

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

如果您事先不知道該基礎,但是您確實知道它們將具有正確的前綴,那麼如果您傳遞0作為基礎,則Python可以為您推斷這一點:

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

非小數(即整數)來自其他基地的文字

但是,如果您的動機是讓自己的代碼明確表示硬編碼的特定值,那麼您可能不需要從基礎轉換 - 您可以讓Python自動使用正確的語法為您完成。

您可以使用apropos前綴以自動轉換為具有以下文字的整數。 這些適用於Python 2和Python 3:

二進制,前綴0b

>>> 0b11111
31

八進制,前綴0o

>>> 0o37
31

十六進制,前綴0x

>>> 0x1f
31

這在描述二進制標誌,代碼中的文件權限或顏色的十六進制值時非常有用 - 例如,注意不要引號:

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

模糊Python 2八進制與Python 3兼容

如果在Python 2中看到一個以0開頭的整數,則這是(不推薦)的八進制語法。

>>> 037
31

這很糟糕,因為它看起來應該是37 。 所以在Python 3中,它現在引發了一個SyntaxError

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

將您的Python 2八進制轉換為使用0o前綴在2和3中工作的八進制:

>>> 0o37
31

本地化和逗號

對於像float("545,545.2222")這樣引發異常的情況,您應該考慮數字的字符串表示中逗號的可能性。 相反,使用locale方法將字符串轉換為數字並正確解釋逗號。 一旦語言環境設置為所需的數字約定, locale.atof方法就會在一步中轉換為浮點數。

例1 - 美國數字慣例

在美國和英國,逗號可以用作千位分隔符。 在美國語言環境的這個例子中,逗號作為分隔符被正確處理:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

例2 - 歐洲數字慣例

在世界大多數國家中 ,逗號用於十進制標記而不是句號。 在這個使用法語區域設置的示例中,逗號被正確處理為小數點標記:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

方法locale.atoi也可用,但參數應該是一個整數。


Python在一行中有很好的解析靈活性。

str = "545.2222"
print ("int: ", + int(float(a)))
print ("float: ", +(float(a)))

YAML解析器可以幫助你找出你的字符串是什麼數據類型。 使用yaml.load() ,然後你可以使用type(result)來測試type:

>>> import yaml

>>> a = "545.2222"
>>> result = yaml.load(a)
>>> result
545.22220000000004
>>> type(result)
<type 'float'>

>>> b = "31"
>>> result = yaml.load(b)
>>> result
31
>>> type(result)
<type 'int'>

>>> c = "HI"
>>> result = yaml.load(c)
>>> result
'HI'
>>> type(result)
<type 'str'>

這是 https://.com/a/33017514/5973334 的更正版本

這將嘗試解析一個字符串並根據字符串表示的內容返回intfloat 。 它可能會引發解析異常或產生一些意外行為 。

  def get_int_or_float(v):
        number_as_float = float(v)
        number_as_int = int(number_as_float)
        return number_as_int if number_as_float == number_as_int else 
        number_as_float

你需要考慮四捨五入來正確地做到這一點。

即int(5.1)=> 5 int(5.6)=> 5 - 錯誤,應該是6,所以我們做int(5.6 + 0.5)=> 6

def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)

使用:

def num(s):
    try:
        for each in s:
            yield int(each)
    except ValueError:
        yield float(each)
a = num(["123.55","345","44"])
print a.next()
print a.next()

這是我能想出的最Pythonic的方式。


如果您不反對第三方模塊,則可以檢出fastnumbers模塊。 它提供了一個名為fast_real的函數,它完全實現了這個問題所要求的,並且比純Python實現更快速:

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int

我很驚訝沒有人提到正則表達式,因為有時候字符串必須在投射到數字之前做好準備和規範化

import re
def parseNumber(value, as_int=False):
    try:
        number = float(re.sub('[^.\-\d]', '', value))
        if as_int:
            return int(number + 0.5)
        else:
            return number
    except ValueError:
        return float('nan')  # or None if you wish

用法:

parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999\n')
> 99999.0

順便說一句,驗證你有一個數字:

import numbers
def is_number(value):
    return isinstance(value, numbers.Number)
    # will work with int, float, long, Decimal

用戶codelogicharley是正確的,但要記住,如果你知道字符串是一個整數(例如545),你可以調用int(“545”)而不需要首先強制浮動。

如果你的字符串在列表中,你也可以使用map函數。

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

只有它們都是同一類型才是好事。


這是另一種值得在此提及的方法, ast.literal_eval

這可用於安全地評估包含來自不受信任來源的Python表達式的字符串,而無需自行解析值。

也就是說,一個安全的“評估”

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

這是對你的問題的另一種解釋(提示:它是模糊的)。 你可能在尋找這樣的東西:

def parseIntOrFloat( aString ):
    return eval( aString )

它是這樣工作的...

>>> parseIntOrFloat("545.2222")
545.22220000000004
>>> parseIntOrFloat("545")
545

理論上講,存在註入漏洞。 例如,字符串可以是"import os; os.abort()" 。 然而,沒有任何關於弦線來自哪裡的背景,這種可能性是理論上的猜測。 由於這個問題很模糊,所以這個漏洞是否真的存在還不是很清楚。


def get_int_or_float(v):
    number_as_float = float(v)
    number_as_int = int(number_as_float)
    return number_as_int if number_as_float == number_as_int else number_as_float

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

float(x) if '.' in x else int(x)




integer