Lua string ke int

183

Bagaimana saya bisa mengkonversi string ke integer di Lua?

Saya memiliki string seperti ini:

a = "10"

Saya ingin dikonversi menjadi 10, jumlahnya.

David Gomes
sumber
6
Tautan yang tepat adalah bagian tentang pemaksaan: 5.1 , 5.2 .
lhf
5
@NicolBolas: +1 untuk mengajukan pertanyaan yang merupakan hasil Google pertama dan memberikan jawaban langsung.
sebelum
2
+1 untuk mengkompensasi troll yang menggigit ini Nicol: D
Петър Петров
Lua hanya melakukan konversi secara otomatis antara string dan angka. Jika Anda ingin memastikan jenisnya, gunakan a = tonumber (a).
xpol

Jawaban:

299

Gunakan tonumberfungsinya . Seperti dalam a = tonumber("10").

Nicol Bolas
sumber
4
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.

lhf
sumber
2
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))

Keluaran

   string                                                                                                                                                                          
   number

sumber
8

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:

local function 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.

Badai badai
sumber
5

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

INTI kerajinanX
sumber
4

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.
4xel
sumber
3

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 < 0 and math.ceil( num ) or math.floor( num )
end

Referensi: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html

Leslie Krause
sumber
2

Anda dapat membuat accessor untuk menyimpan "10" sebagai int 10 di dalamnya.

Contoh:

x = tonumber("10")

jika Anda mencetak variabel x, itu akan menghasilkan int 10 dan bukan "10"

sama seperti proses Python

x = int ("10")

Terima kasih.

pengguna5555332
sumber
1

tonumber (e [, base])

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

Saya menjawab mengingat Lua5.3

Shubham
sumber
0
Lua 5.3.1  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> math.floor("10");
10
> tonumber("10");
10
> "10" + 0;
10.0
> "10" | 0;
10
Viacheslav
sumber
-1

inilah yang harus Anda masukkan

local stringnumber = "10"
local a = tonumber(stringnumber)
print(a + 10)

output:

20
ada di sana
sumber
a = tonumber (stringnumber) sudah
mencukupi