Pertanyaan Bagaimana cara menguraikan string ke float atau int dengan Python?


Dengan Python, bagaimana saya bisa menguraikan string numerik seperti "545.2222" ke nilai float yang sesuai, 542.2222? Atau parse string "31" ke integer, 31?

Saya hanya ingin tahu cara menguraikan a mengapung  string ke a float, dan (secara terpisah) an int  string ke sebuah int.


1757
2017-12-19 01:52


asal


Jawaban:


>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

2084
2017-12-19 01:54



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

441
2017-12-19 02:31



Metode Python untuk memeriksa apakah string adalah float:

def isfloat(value):
  try:
    float(value)
    return True
  except:
    return False

Nama yang lebih panjang dan lebih akurat untuk fungsi ini dapat berupa: isConvertibleToFloat(value)

Apa itu, dan bukan pelampung Python mungkin mengejutkan Anda:

val                   isfloat(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

Anda pikir Anda tahu nomor apa? Anda tidak sebaik yang Anda pikirkan! Bukan kejutan besar.


416
2018-01-05 04:15



Ini adalah metode lain yang layak disebutkan di sini, ast.literal_eval:

Ini dapat digunakan untuk mengevaluasi string yang mengandung ekspresi Python dengan aman dari sumber yang tidak dipercaya tanpa perlu menguraikan nilai-nilai itu sendiri.

Yaitu, aman 'eval'

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

104
2018-03-01 04:23



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

74
2017-12-19 02:32



Lokalisasi dan koma

Anda harus mempertimbangkan kemungkinan koma dalam representasi string angka, untuk kasus-kasus seperti float("545,545.2222") yang melempar pengecualian. Sebaliknya, gunakan metode dalam locale untuk mengubah string menjadi angka dan menafsirkan koma dengan benar. Itu locale.atof metode mengkonversi ke float dalam satu langkah setelah lokal telah ditetapkan untuk konvensi nomor yang diinginkan.

Contoh 1 - Konvensi nomor Amerika Serikat 

Di Amerika Serikat dan Inggris, koma dapat digunakan sebagai pemisah ribuan. Dalam contoh ini dengan lokal Amerika, koma ditangani dengan benar sebagai pemisah:

>>> 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
>>>

Contoh 2 - Konvensi nomor Eropa

Dalam Mayoritas negara di dunia, koma digunakan untuk tanda desimal, bukan periode. Dalam contoh ini dengan lokal Prancis, koma ditangani dengan benar sebagai tanda desimal:

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

Metode locale.atoi juga tersedia, tetapi argumennya harus berupa bilangan bulat.


45
2017-07-23 16:00



Pengguna codelogic dan harley benar, tetapi perlu diingat jika Anda tahu string adalah integer (misalnya, 545), Anda dapat memanggil int ("545") tanpa pengecoran terlebih dahulu untuk mengapung.

Jika string Anda ada dalam daftar, Anda bisa menggunakan fungsi peta juga.

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

Hanya bagus jika mereka semua tipe yang sama.


22
2017-12-19 02:09



Jika Anda tidak keberatan dengan modul pihak ketiga, Anda dapat memeriksa fastnumbers modul. Ini menyediakan fungsi yang disebut fast_real itu persis seperti apa yang ditanyakan pertanyaan ini dan apakah itu lebih cepat daripada implementasi Python murni:

>>> 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

21
2017-08-14 03:21