Рядок Луа до int


183

Як можна перетворити рядок у ціле число в Lua?

У мене є такий рядок:

a = "10"

Я хотів би, щоб це було перетворено на 10, число.


6
Точним посиланням є розділ про примус: 5.1 , 5.2 .
lhf

5
@NicolBolas: +1 для запитання, що є першим результатом Google, і дає прямий відповідь.
ereOn

2
+1, щоб компенсувати цей кусаючий троль Nicol: D
Петър Петров

Lua просто автоматично перетворює між рядками і числами. Якщо ви хочете забезпечити тип, використовуйте a = tonumber (a).
xpol

Відповіді:



33

Ви можете примусити неявне перетворення, використовуючи рядок в арифметичних операціях, як у a= "10" + 0, але це не так зрозуміло або настільки чисто, як tonumberявно використовувати .


2
Ні, він перетворить "10" на ціле число і додасть до нього 0. (Відсутність ясності є тим більше причин використовувати tonumberзамість цього!)
Рена,

16
@ Rena, ясності не бракує. +завжди явно доповнення, ..- конкатенація.
Олег Вікторович Волков

1
@lhf: автоматичний примус працюватиме лише на числах. І оператори порівняння (== ~ = <> <=> =) не перетворюють свої аргументи. І з міркувань продуктивності ви повинні не покладатися на автоматичне примус занадто багато
wsha

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

Вихідні дані

   string                                                                                                                                                                          
   number

8

Усі числа в Lua є плаваючими ( редагуйте: Lua 5.2 або менше). Якщо ви справді хочете перетворитись на "int" (або принаймні повторити цю поведінку), ви можете зробити це:

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

У такому випадку ви явно перетворюєте рядок (або насправді, що б це не було) в число, а потім усікаєте число, як це робиться (int) в Java.

Правка: Це все ще працює в Lua 5.3, навіть думав, що Lua 5.3 має реальні цілі числа, оскільки math.floor()повертає ціле число, тоді як оператор, такий як, як number // 1і раніше, поверне float, якщо numberє float.


5

скажімо, рядок, який ви хочете перетворити на число, знаходиться в змінній S

a=tonumber(S)

за умови, що в ній є числа, і лише числа Sповернуть число, але якщо є будь-які символи, які не є числами (крім періодів для поплавків), він поверне нуль


4

Чіткіший варіант - використовувати тонумер .

З 5.3.2 ця функція буде автоматично виявляти (підписані) цілі числа, плавати (якщо точка присутня) та шістнадцяткову (як цілі числа, так і плаває, якщо рядок починається з "0x" або "0X").

Наступні фрагменти коротші, але не еквівалентні:

  • 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

Слід зазначити, що math.floor()завжди округлюється вниз, і тому не дає розумного результату за негативними значеннями плаваючої точки.

Наприклад, -10,4, представлений у вигляді цілого числа, зазвичай буде або усіченим, або округлим до -10. І все ж результат math.floor () неоднаковий:

math.floor(-10.4) => -11

Для обрізання з перетворенням типів працюватиме така допоміжна функція:

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

Довідка: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html


2

Ви можете зробити аксесуар, щоб зберегти "10" як int 10 у ньому.

Приклад:

x = tonumber("10")

якщо ви надрукуєте змінну x, вона видасть int 10, а не "10"

такий же, як процес Python

x = int ("10")

Дякую.



1

tonumber (e [, base])

tonumberбере два аргументи, перший - рядок, який перетворюється в число, а другий - база e.

Повернене значення tonumberзнаходиться в базі 10.

Якщо цього не baseпередбачено, він перетворює число в базу 10.

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

Якщо база надана, вона перетворює її в задану базу.

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

Якщо eмістить недійсний символ, він повертається 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



-1

ось що ви повинні поставити

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

output:

20

a = tonumber (stringnumber) достатньо
1818
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.