Dengan Python, bagaimana saya bisa mengurai string numerik seperti "545.2222"
nilai float yang sesuai 545.2222
,? Atau parsing string "31"
ke integer 31
,?
Saya hanya ingin tahu cara mengurai float str
ke float
, dan (secara terpisah) int str
ke int
.
python
parsing
floating-point
type-conversion
integer
Tristan Havelick
sumber
sumber
type(my_object)
saja. Hasilnya biasanya dapat disebut sebagai fungsi untuk melakukan konversi. Misalnyatype(100)
hasil dalamint
, jadi Anda dapat meneleponint(my_object)
untuk mencoba mengonversimy_object
ke bilangan bulat. Ini tidak selalu berhasil, tetapi merupakan "tebakan pertama" yang bagus saat coding.int(x) if int(x) == float(x) else float(x)
Jawaban:
sumber
int(a)
tetapiint(float(a))
?int(a)
akan memberikan kesalahan bahwa string tersebut bukan bilangan bulat yang valid:,ValueError: invalid literal for int() with base 10: '545.222'
tetapi mengonversi dari float ke int adalah konversi yang didukung.ValueError
jika Anda ingin amansumber
/
operator di float / int. Tergantung pada konteksnya, mungkin lebih baik mengembalikan int atau float, bukan keduanya.try
untuk melempar pengecualian ketika itu tidak dapat dikonversi menjadi float.s = u'\u0000'
ValueError
untuk memasukkan yang sesuaiexcept
: PMetode Python untuk memeriksa apakah string adalah float:
Nama yang lebih panjang dan lebih akurat untuk fungsi ini adalah:
is_convertible_to_float(value)
Apa itu, dan bukan float di Python mungkin mengejutkan Anda:
Anda pikir Anda tahu nomor apa itu? Anda tidak sebagus yang Anda kira! Bukan kejutan besar.
Jangan gunakan kode ini pada perangkat lunak yang kritis!
Menangkap pengecualian luas dengan cara ini, membunuh kenari dan melahap pengecualian menciptakan peluang kecil bahwa pelampung yang valid sebagai string akan kembali palsu. The
float(...)
baris kode dapat gagal untuk setiap seribu alasan yang tidak ada hubungannya dengan isi string. Tetapi jika Anda menulis perangkat lunak penting dalam bahasa prototipe mengetik bebek seperti Python, maka Anda memiliki masalah yang jauh lebih besar.sumber
UTF-8
Mesin terbang untuk China4
telah berubah selama bertahun-tahun tergantung pada bagaimana pengembang stackoverflow mengubah skema pengkodean karakter mereka pada toolstack microsoft mereka. Sangat penasaran melihatnya membalik selama bertahun-tahun ketika skema konversi baru menegaskan ideologi baru mereka. Tapi ya,UTF-8
Mesin terbang apa pun untuk numerik oriental Timur bukanlah pelampung Python. Bazinga."- 12.3"
dan"45 e6"
TypeError, ValueError
Ini adalah metode lain yang layak disebutkan di sini, ast.literal_eval :
Artinya, 'eval' yang aman
sumber
python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>
Untuk memperjelas mengapa ini menjadi masalah, jika Anda ingin meninggalkan nomor telepon sendiri dan tidak menganggap mereka adalah ekspresi matematis, maka pendekatan ini bukan untuk Anda.ast.literal_eval
, dan telah dibahas di sini .sumber
float("nan")
juga dengan nilai float yang valid sehingga jawaban di atas tidak akan menangkap sama sekali192.168.0.1
; atau"This is not a good approach. :)"
Lokalisasi dan koma
Anda harus mempertimbangkan kemungkinan koma dalam representasi string angka, untuk kasus seperti
float("545,545.2222")
yang melempar pengecualian. Alih-alih, gunakan metodelocale
untuk mengonversi string menjadi angka dan menafsirkan koma dengan benar. Thelocale.atof
Metode bertobat untuk pelampung dalam satu langkah setelah lokal telah ditetapkan untuk konvensi angka 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:
Contoh 2 - konvensi nomor Eropa
Di sebagian besar negara di dunia , koma digunakan untuk tanda desimal alih-alih tanda titik. Dalam contoh ini dengan lokal Prancis, koma ditangani dengan benar sebagai tanda desimal:
Metode
locale.atoi
ini juga tersedia, tetapi argumen harus berupa bilangan bulat.sumber
x = '1'; locale.atof(x)
kembali1.0
ketika saya benar-benar ingin1
.locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)
locale.atoi
dalam mencoba dan menggunakanlocale.atof
pengecualian - itu mungkin lebih mudah dibaca.Jika Anda tidak menolak modul pihak ketiga, Anda bisa melihat modul fastnumber . Ini menyediakan fungsi yang disebut fast_real yang melakukan persis apa yang diminta pertanyaan ini dan melakukannya lebih cepat daripada implementasi murni-Python:
sumber
Pengguna codelogic dan harley benar, tetapi perlu diingat jika Anda tahu string adalah integer (misalnya, 545), Anda dapat memanggil int ("545") tanpa terlebih dahulu melakukan casting untuk mengapung.
Jika string Anda ada dalam daftar, Anda bisa menggunakan fungsi peta juga.
Itu hanya baik jika mereka semua tipe yang sama.
sumber
Ada baiknya Anda meminta untuk melakukan ini secara terpisah. Jika Anda mencampurnya, Anda mungkin menyiapkan diri untuk masalah nanti. Jawaban sederhananya adalah:
"545.2222"
untuk mengapung:"31"
ke integer:Konversi lain, int ke dan dari string dan literal:
Konversi dari berbagai pangkalan, dan Anda harus tahu pangkalan di muka (10 adalah default). Catatan Anda bisa mengawali mereka dengan apa yang Python harapkan untuk literalnya (lihat di bawah) atau menghapus awalan:
Jika Anda tidak tahu basis sebelumnya, tetapi Anda tahu mereka akan memiliki awalan yang benar, Python dapat menyimpulkan ini untuk Anda jika Anda lulus
0
sebagai basis:Literal Non-Desimal (yaitu Integer) dari Basa lain
Namun, jika motivasi Anda adalah untuk memiliki kode sendiri dengan jelas mewakili nilai spesifik yang dikodekan secara keras, Anda mungkin tidak perlu mengonversi dari basis - Anda dapat membiarkan Python melakukannya untuk Anda secara otomatis dengan sintaks yang benar.
Anda dapat menggunakan awalan apropos untuk mendapatkan konversi otomatis ke bilangan bulat dengan literal berikut . Ini berlaku untuk Python 2 dan 3:
Biner, awalan
0b
Oktal, awalan
0o
Heksadesimal, awalan
0x
Ini dapat berguna saat menggambarkan flag biner, izin file dalam kode, atau nilai hex untuk warna - misalnya, perhatikan tanpa tanda kutip:
Membuat ambigual Python 2 oktal kompatibel dengan Python 3
Jika Anda melihat bilangan bulat yang dimulai dengan 0, dalam Python 2, ini adalah sintaks oktal (tidak digunakan).
Itu buruk karena sepertinya nilainya seharusnya
37
. Jadi dalam Python 3, sekarang memunculkanSyntaxError
:Ubah Python 2 oktal Anda menjadi oktal yang berfungsi di 2 dan 3 dengan
0o
awalan:sumber
Pertanyaannya agak lama. Tapi izinkan saya menyarankan fungsi, parseStr, yang membuat sesuatu yang serupa, yaitu, mengembalikan integer atau float dan jika string ASCII yang diberikan tidak dapat dikonversi ke tidak satupun dari mereka mengembalikannya tidak tersentuh. Kode tentu saja dapat disesuaikan untuk hanya melakukan apa yang Anda inginkan:
sumber
1e3
adalah angka dalam python, tetapi string sesuai dengan kode Anda.float("545.2222")
danint(float("545.2222"))
sumber
Saya menggunakan fungsi ini untuk itu
Ini akan mengkonversi string ke tipenya
sumber
parse_str(' 1')
(dengan spasi) akan kembaliNone
, tidak1
.The YAML parser dapat membantu Anda mengetahui apa yang datatype string Anda adalah. Gunakan
yaml.load()
, dan kemudian Anda dapat menggunakantype(result)
untuk menguji jenis:sumber
sumber
except
bagian Anda jika Anda tidak melakukan apa pun di sana? float () akan menaikkan untuk Anda.int
ataufloat
tergantung pada apa yang diwakili string tersebut. Mungkin muncul pengecualian parsing atau [memiliki perilaku yang tidak terduga] [1].sumber
Anda perlu mempertimbangkan pembulatan akun untuk melakukan ini dengan benar.
Yaitu int (5.1) => 5 int (5.6) => 5 - salah, harus 6 jadi kita melakukan int (5.6 + 0.5) => 6
sumber
int
danfloat
. Dan itu akan memberikan pengecualian, kapann
string, seperti OP yang diinginkan. Mungkin Anda berarti: Ketika sebuahint
hasil yang diinginkan,round
harus dilakukan konversi SETELAH mengapung. Jika fungsi SELALU mengembalikan int, maka Anda tidak perlu bagian kecuali - seluruh fungsi bisaint(round(float(input)))
. Jika fungsinya harus mengembalikan int jika memungkinkan, jika tidak float, maka solusi asli javier benar!Saya terkejut tidak ada yang menyebutkan regex karena kadang-kadang string harus disiapkan dan dinormalisasi sebelum casting ke nomor
pemakaian:
dan omong-omong, sesuatu untuk memverifikasi Anda memiliki nomor:
sumber
Untuk typecast dalam python gunakan fungsi konstruktor dari tipe tersebut, meneruskan string (atau nilai apa pun yang Anda coba gunakan) sebagai parameter.
Sebagai contoh:
Di belakang layar, python memanggil
__float__
metode objek , yang seharusnya mengembalikan representasi parameter. Ini sangat kuat, karena Anda dapat mendefinisikan tipe Anda sendiri (menggunakan kelas) dengan__float__
metode sehingga dapat dilemparkan ke float menggunakan float (myobject).sumber
Ini adalah versi koreksi dari https://stackoverflow.com/a/33017514/5973334
Ini akan mencoba mengurai string dan mengembalikan salah satu
int
ataufloat
tergantung pada apa yang diwakili string tersebut. Mungkin muncul pengecualian parsing atau memiliki beberapa perilaku yang tidak terduga .sumber
Lewati string Anda ke fungsi ini:
Ini akan mengembalikan int, float atau string tergantung pada apa yang telah dilewati.
string yang merupakan int
string yang mengapung
string yang merupakan string
string yang terlihat seperti pelampung
sumber
Menggunakan:
Ini adalah cara paling Pythonic yang bisa saya lakukan.
sumber
float
. Thetry
...catch
blok mungkin harus berada di dalamfor
lingkaran.Menangani hex, oktal, biner, desimal, dan float
Solusi ini akan menangani semua konvensi string untuk angka (semua yang saya ketahui).
Output test case ini menggambarkan apa yang saya bicarakan.
Inilah tesnya:
sumber
Menggunakan:
sumber
Ini adalah fungsi yang akan mengkonversi
object
(tidak hanyastr
) menjadiint
ataufloat
, berdasarkan apakah string aktual yang disediakan terlihat sepertiint
ataufloat
. Lebih lanjut jika itu adalah objek yang memiliki keduanya__float
dan__int__
metode, itu default untuk digunakan__float__
sumber
Dengan menggunakan metode int dan float kita dapat mengonversi string menjadi integer dan float.
sumber
eval()
adalah solusi yang sangat bagus untuk pertanyaan ini. Tidak perlu memeriksa apakah nomornya int atau float, itu hanya memberikan padanan yang sesuai. Jika diperlukan metode lain, cobacoba-kecuali juga bisa dijadikan alternatif. Coba konversi string menjadi int di dalam blok try. Jika string akan menjadi nilai float, itu akan melempar kesalahan yang akan ditangkap di blok kecuali, seperti ini
sumber
Berikut ini interpretasi lain dari pertanyaan Anda (petunjuk: tidak jelas). Mungkin Anda mencari sesuatu seperti ini:
Ini berfungsi seperti ini ...
Secara teoritis, ada kerentanan injeksi. String bisa, misalnya
"import os; os.abort()"
. Namun, tanpa latar belakang dari mana string itu berasal, kemungkinannya adalah spekulasi teoretis. Karena pertanyaannya tidak jelas, sama sekali tidak jelas apakah kerentanan ini benar-benar ada atau tidak.sumber
eval()
lebih dari 3 kali lebih lambattry: int(s) except: float(s)
.eval
itu praktik buruk (Anda harus tahu karena Anda memiliki reputasi 310 ribu orang)