İnt için Lua dizesi


183

Bir dizeyi Lua'da tamsayıya nasıl dönüştürebilirim?

Ben böyle bir dize var:

a = "10"

Sayı 10'a dönüştürülmesini istiyorum.


6
Kesin bağlantı, baskı ile ilgili bölümdür: 5.1 , 5.2 .
lhf

5
@NicolBolas: İlk Google sonucu olan ve doğrudan doğruya bir yanıt sağlayan bir soru sormak için +1.
2014

2
Bu ısırma
trolünü

Lua sadece dizeler ve sayılar arasında otomatik olarak dönüşüm yapar. Türü sağlamak istiyorsanız, a = tonumber (a) kullanın.
xpol

Yanıtlar:



33

Bir aritmetik işlemlerde olduğu gibi bir dize kullanarak örtük bir dönüşümü zorlayabilirsiniz a= "10" + 0, ancak bu tonumberaçıkça kullanmak kadar açık veya temiz değildir .


2
Hayır, "10" değerini tamsayıya dönüştürecek ve 0'a ekleyecektir. (Netlik eksikliği, tonumberbunun yerine kullanmak için daha fazla nedendir !)
Rena

16
@Rena, netlik eksikliği yok. +her zaman açıkça ekleme, ..- birleştirme.
Oleg

1
@lhf: otomatik zorlama yalnızca sayılar üzerinde çalışır. Ve karşılaştırma işleçleri (== ~ = <> <=> =) argümanlarını dönüştürmez. Performans nedenlerinden dolayı otomatik zorlamaya çok fazla güvenmekten kaçınmalısınız
wsha

9
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))

Çıktı

   string                                                                                                                                                                          
   number

8

Lua'daki tüm sayılar yüzer ( değiştir: Lua 5.2 veya daha az). Gerçekten bir "int" değerine dönüştürmek (veya en azından bu davranışı çoğaltmak) istiyorsanız, bunu yapabilirsiniz:

local function ToInteger(number)
    return math.floor(tonumber(number) or error("Could not cast '" .. tostring(number) .. "' to number.'"))
end

Bu durumda, dizeyi (veya gerçekte ne olursa olsun) açıkça bir sayıya dönüştürür ve ardından sayıyı Java'da bir (int) kadro gibi kesersiniz.

Düzenleme: Bu hala Lua 5.3 çalışır, hatta Lua 5.3 math.floor()bir tamsayı döndürür gibi gerçek tamsayıları var iken, böyle bir operatör number // 1hala bir şamandıra ise bir şamandıra dönecektir number.


5

sayıya dönüştürmek istediğiniz dizenin değişkente olduğunu varsayalım S

a=tonumber(S)

ancak içinde sayılar varsa ve yalnızca sayılar Sbir sayı döndürür, ancak sayı olmayan herhangi bir karakter varsa (şamandıralar için süreler hariç) sıfır döndürür


4

Daha net seçenek ton sayısını kullanmaktır .

5.3.2'den itibaren, bu işlev otomatik olarak tamsayıları (işaretli), kayan nokta (bir nokta varsa) ve onaltılı (dize "0x" veya "0X" ile başlıyorsa hem tamsayılar hem de kayan noktalar) algılar.

Aşağıdaki snippet'ler daha kısadır ancak eşdeğer değildir:

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

3

Her math.floor()zaman aşağı yuvarlandığına ve bu nedenle negatif kayan nokta değerleri için mantıklı bir sonuç vermediğine dikkat edilmelidir .

Örneğin, bir tamsayı olarak temsil edilen -10.4 genellikle kesilir veya -10'a yuvarlanır. Ancak math.floor () sonucu aynı değildir:

math.floor(-10.4) => -11

Tür dönüşümü ile kesme için aşağıdaki yardımcı işlev çalışacaktır:

function tointeger( x )
    num = tonumber( x )
    return num < 0 and math.ceil( num ) or math.floor( num )
end

Referans: http://lua.2524044.n2.nabble.com/5-3- Dönüştürme-a- yüzer-point-number-to-integer-td7664081.html


2

"10" u int 10 olarak tutmak için bir erişimci yapabilirsiniz.

Misal:

x = tonumber("10")

x değişkenini yazdırırsanız, "10" değil, int 10 verir

Python süreci ile aynı

x = int ("10")

Teşekkürler.



1

tonumber (e [, base])

tonumberiki argüman alır, ilki sayıya dönüştürülen dize, ikincisi ise taban e.

Dönüş değeri tonumber10 tabanındadır.

Hayır basesağlanmışsa, sayıyı 10 tabanına dönüştürür.

> a = '101'
> tonumber(a)
101

Baz sağlanırsa, verilen tabana dönüştürür.

> a = '101'
> 
> tonumber(a, 2)
5
> tonumber(a, 8)
65
> tonumber(a, 10)
101
> tonumber(a, 16)
257
> 

Eğer eo zaman geçersiz bir karakter içeriyor döndürür 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

Lua5.3 dikkate alınarak cevapladım


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

-1

işte koymalısın

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

output:

20

a = ton (dize sayısı) yeterli
wsha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.