Perhatikan bahwa ini akan mengembalikan tupel (jika berhasil) dan bukan integer secara langsung. Jika Anda ingin melakukan itu, lihat jawaban @Szymon Jeż denganString.to_integer/1
6
Apakah ada alasan untuk menggunakan Integer.parse/1lebih dari itu String.to_integer/1?
Ian Vaughan
10
@IanVaughan Integer.parse/1mengembalikan :erroratom jika tidak berhasil. String.to_integer/1melempar a (FunctionClauseError).
Jonathan Soifer
52
Selain fungsi Integer.parse/1dan Float.parse/1yang disarankan José, Anda juga dapat memeriksa String.to_integer/1dan String.to_float/1.
Petunjuk: Lihat juga to_atom/1, to_char_list/1, to_existing_atom/1untuk konversi lainnya.
Ini akan menimbulkan kesalahan jika val tidak murni bilangan bulat. Saya menambahkan kasus pada hasil untuk memastikan konversi berhasil. Klausa kedua bisa umum untuk menangkap: error atau string kedua yang tidak kosong karena Anda tidak terlalu peduli apakah inputnya adalah "x3" atau "3x".
Sinc
14
Ada 4 fungsi untuk membuat angka dari string
String.to_integer, String.to_float
Integer.parse, Float.parse
String.to_integerbekerja dengan baik tetapi String.to_floatlebih sulit:
Karena String.to_floathanya dapat menangani float yang diformat dengan baik, misalnya:, 1.0bukan 1(integer). Itu didokumentasikan di String.to_floatdoc
Mengembalikan float yang representasi teksnya adalah string.
string harus merupakan representasi string dari pelampung termasuk titik desimal. Untuk mengurai string tanpa koma desimal sebagai float maka Float.parse / 1 harus digunakan. Jika tidak, ArgumentError akan dimunculkan.
Tetapi Float.parsemengembalikan tupel dari 2 elemen, bukan angka yang Anda inginkan, jadi memasukkannya ke dalam pipeline tidak "keren":
Bagaimana cara menggunakannya dalam fungsi? Solusi terbaik saya adalah fn q -> {v, _} = Float.parse(q); v endyang tidak saya sukai. Saya suka menggunakannya di Enum.map, misalnya list |> Enum.map(&String.to_float/1)tetapi string.to_float tidak berfungsi untuk bilangan bulat?
Jika Anda ingin mengonversi string menjadi tipe numerik apa pun yang ada di dalam string & menghapus semua karakter lain, ini mungkin berlebihan, tetapi akan mengembalikan float jika float atau int jika int atau nil jika string tidak berisi tipe numerik.
String.to_integer/1
Integer.parse/1
lebih dari ituString.to_integer/1
?Integer.parse/1
mengembalikan:error
atom jika tidak berhasil.String.to_integer/1
melempar a(FunctionClauseError)
.Selain fungsi
Integer.parse/1
danFloat.parse/1
yang disarankan José, Anda juga dapat memeriksaString.to_integer/1
danString.to_float/1
.Petunjuk: Lihat juga
to_atom/1
,to_char_list/1
,to_existing_atom/1
untuk konversi lainnya.sumber
Terima kasih teman-teman di halaman ini, hanya menyederhanakan jawaban di sini:
karena memvalidasi bahwa seluruh string telah diurai (bukan hanya awalan).
sumber
Ada 4 fungsi untuk membuat angka dari string
String.to_integer
bekerja dengan baik tetapiString.to_float
lebih sulit:Karena
String.to_float
hanya dapat menangani float yang diformat dengan baik, misalnya:,1.0
bukan1
(integer). Itu didokumentasikan diString.to_float
docTetapi
Float.parse
mengembalikan tupel dari 2 elemen, bukan angka yang Anda inginkan, jadi memasukkannya ke dalam pipeline tidak "keren":Menggunakan
elem
untuk mendapatkan elemen pertama dari tuple membuatnya lebih pendek dan lebih manis:sumber
Anda dapat mengubahnya menjadi char_list dan kemudian menggunakan Erlang
to_integer/1
atauto_float/1
.Misalnya
sumber
fn q -> {v, _} = Float.parse(q); v end
yang tidak saya sukai. Saya suka menggunakannya diEnum.map
, misalnyalist |> Enum.map(&String.to_float/1)
tetapi string.to_float tidak berfungsi untuk bilangan bulat?sumber
Masalah dengan menggunakan
Integer.parse/1
adalah bahwa is akan mengurai bagian non-numerik dari string selama berada di ujung ekor. Sebagai contoh:Demikian pula
String.to_integer/1
hasilnya sebagai berikut:Sebagai gantinya, validasi string terlebih dahulu.
Ekspresi reguler bisa lebih sederhana (misalnya
^[0-9]*$
) tergantung pada kasus penggunaan Anda.sumber
Jika Anda ingin mengonversi string menjadi tipe numerik apa pun yang ada di dalam string & menghapus semua karakter lain, ini mungkin berlebihan, tetapi akan mengembalikan float jika float atau int jika int atau nil jika string tidak berisi tipe numerik.
sumber