Dalam Lua 5.3, bilangan bulat (default 64-bit) diperlakukan sesuai dengan itu ( lua.org/manual/5.3/manual.html ): "Konstanta numerik dengan titik fraksional atau eksponen menunjukkan float; jika tidak, ini menunjukkan integer."
Kevin Lee
33
Anda dapat memaksa konversi implisit dengan menggunakan string dalam operasi aritmatika seperti pada a= "10" + 0, tetapi ini tidak cukup jelas atau sebersih menggunakan tonumbersecara eksplisit.
Tidak, itu akan mengubah "10" menjadi bilangan bulat dan kemudian menambahkan 0 ke dalamnya. (Namun, kurangnya kejelasan lebih merupakan alasan untuk menggunakannya tonumber!)
Rena
16
@Rena, tidak ada kekurangan dalam kejelasan. +selalu ditambahkan secara eksplisit, ..- Rangkaian.
Oleg V. Volkov
1
@ lhf: pemaksaan otomatis hanya akan berfungsi pada angka. Dan operator pembanding (== ~ = <> <=> =) tidak mengonversi argumen mereka. Dan untuk alasan kinerja Anda harus menghindari terlalu mengandalkan paksaan otomatis
wsha
9
local a ="10"
print(type(a))local num = tonumber(a)
print(type(num))
Semua angka dalam Lua adalah float ( edit: Lua 5.2 atau kurang). Jika Anda benar-benar ingin mengonversi menjadi "int" (atau setidaknya meniru perilaku ini), Anda dapat melakukan ini:
localfunction ToInteger(number)return math.floor(tonumber(number)or error("Could not cast '".. tostring(number).."' to number.'"))end
Dalam hal ini Anda secara eksplisit mengubah string (atau benar-benar, apa pun itu) menjadi angka, dan kemudian memotong angka seperti gips (int) akan dilakukan di Jawa.
Sunting: Ini masih bekerja di Lua 5.3, bahkan berpikir Lua 5.3 memiliki bilangan bulat nyata, seperti math.floor()mengembalikan bilangan bulat, sedangkan operator seperti number // 1itu masih akan mengembalikan float jika numberfloat.
katakanlah string yang ingin Anda ubah menjadi angka ada dalam variabel S
a=tonumber(S)
asalkan ada angka dan hanya angka di Sdalamnya akan mengembalikan angka, tetapi jika ada karakter yang bukan angka (kecuali periode untuk mengapung) itu akan mengembalikan nihil
Opsi yang lebih jelas adalah menggunakan tonumber .
Pada 5.3.2, fungsi ini akan secara otomatis mendeteksi (menandatangani) integer, float (jika ada titik) dan heksadesimal (baik integer dan float, jika string dimulai dengan "0x" atau "0X").
Cuplikan berikut ini lebih pendek tetapi tidak setara:
a +0-- forces the conversion into float, due to how + works.
a |0-- (| is the bitwise or) forces the conversion into integer. -- However, unlike `math.tointeger`, it errors if it fails.
Perlu dicatat bahwa math.floor()selalu dibulatkan ke bawah, dan karena itu tidak menghasilkan hasil yang masuk akal untuk nilai-nilai floating point negatif.
Sebagai contoh, -10.4 direpresentasikan sebagai integer biasanya akan terpotong atau dibulatkan ke -10. Namun hasil dari math.floor () tidak sama:
math.floor(-10.4)=>-11
Untuk pemotongan dengan konversi tipe, fungsi pembantu berikut ini akan berfungsi:
function tointeger( x )
num = tonumber( x )return num <0and math.ceil( num )or math.floor( num )end
tonumbermengambil dua argumen, pertama adalah string yang dikonversi ke angka dan yang kedua adalah basis dari e.
Nilai pengembalian tonumberada di basis 10.
Jika tidak basedisediakan itu mengkonversi nomor ke basis 10.
> a ='101'> tonumber(a)101
Jika basis disediakan, ia mengubahnya ke basis yang diberikan.
> a ='101'>> tonumber(a,2)5> tonumber(a,8)65> tonumber(a,10)101> tonumber(a,16)257>
Jika eberisi karakter yang tidak valid maka kembali nil.
>--[[ Failed because base 2 numbers consist (0 and 1) --]]> a ='112'> tonumber(a,2)nil>>--[[ similar to above one, this failed because --]]>--[[ base 8 consist (0 - 7) --]]>--[[ base 10 consist (0 - 9) --]]> a ='AB'> tonumber(a,8)nil> tonumber(a,10)nil> tonumber(a,16)171
Jawaban:
Gunakan
tonumber
fungsinya . Seperti dalama = tonumber("10")
.sumber
Anda dapat memaksa konversi implisit dengan menggunakan string dalam operasi aritmatika seperti pada
a= "10" + 0
, tetapi ini tidak cukup jelas atau sebersih menggunakantonumber
secara eksplisit.sumber
tonumber
!)+
selalu ditambahkan secara eksplisit,..
- Rangkaian.Keluaran
sumber
Semua angka dalam Lua adalah float ( edit: Lua 5.2 atau kurang). Jika Anda benar-benar ingin mengonversi menjadi "int" (atau setidaknya meniru perilaku ini), Anda dapat melakukan ini:
Dalam hal ini Anda secara eksplisit mengubah string (atau benar-benar, apa pun itu) menjadi angka, dan kemudian memotong angka seperti gips (int) akan dilakukan di Jawa.
Sunting: Ini masih bekerja di Lua 5.3, bahkan berpikir Lua 5.3 memiliki bilangan bulat nyata, seperti
math.floor()
mengembalikan bilangan bulat, sedangkan operator sepertinumber // 1
itu masih akan mengembalikan float jikanumber
float.sumber
katakanlah string yang ingin Anda ubah menjadi angka ada dalam variabel
S
asalkan ada angka dan hanya angka di
S
dalamnya akan mengembalikan angka, tetapi jika ada karakter yang bukan angka (kecuali periode untuk mengapung) itu akan mengembalikan nihilsumber
Opsi yang lebih jelas adalah menggunakan tonumber .
Pada 5.3.2, fungsi ini akan secara otomatis mendeteksi (menandatangani) integer, float (jika ada titik) dan heksadesimal (baik integer dan float, jika string dimulai dengan "0x" atau "0X").
Cuplikan berikut ini lebih pendek tetapi tidak setara:
sumber
Perlu dicatat bahwa
math.floor()
selalu dibulatkan ke bawah, dan karena itu tidak menghasilkan hasil yang masuk akal untuk nilai-nilai floating point negatif.Sebagai contoh, -10.4 direpresentasikan sebagai integer biasanya akan terpotong atau dibulatkan ke -10. Namun hasil dari math.floor () tidak sama:
Untuk pemotongan dengan konversi tipe, fungsi pembantu berikut ini akan berfungsi:
Referensi: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html
sumber
Anda dapat membuat accessor untuk menyimpan "10" sebagai int 10 di dalamnya.
Contoh:
jika Anda mencetak variabel x, itu akan menghasilkan int 10 dan bukan "10"
sama seperti proses Python
x = int ("10")
Terima kasih.
sumber
Saya akan merekomendasikan untuk memeriksa Hyperpolyglot, memiliki perbandingan yang luar biasa: http://hyperpolyglot.org/
http://hyperpolyglot.org/more#str-to-num-note
ps. Sebenarnya Lua dikonversi menjadi dobel bukan menjadi int.
http://www.lua.org/pil/2.3.html
sumber
tonumber (e [, base])
tonumber
mengambil dua argumen, pertama adalah string yang dikonversi ke angka dan yang kedua adalah basis darie
.Nilai pengembalian
tonumber
ada di basis 10.Jika tidak
base
disediakan itu mengkonversi nomor ke basis 10.Jika basis disediakan, ia mengubahnya ke basis yang diberikan.
Jika
e
berisi karakter yang tidak valid maka kembalinil
.Saya menjawab mengingat Lua5.3
sumber
sumber
inilah yang harus Anda masukkan
sumber