Як можна перетворити рядок у ціле число в Lua?
У мене є такий рядок:
a = "10"
Я хотів би, щоб це було перетворено на 10, число.
Як можна перетворити рядок у ціле число в Lua?
У мене є такий рядок:
a = "10"
Я хотів би, щоб це було перетворено на 10, число.
Відповіді:
Використовуйте tonumber
функцію . Як у a = tonumber("10")
.
Ви можете примусити неявне перетворення, використовуючи рядок в арифметичних операціях, як у a= "10" + 0
, але це не так зрозуміло або настільки чисто, як tonumber
явно використовувати .
tonumber
замість цього!)
+
завжди явно доповнення, ..
- конкатенація.
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))
Вихідні дані
string
number
Усі числа в 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.
скажімо, рядок, який ви хочете перетворити на число, знаходиться в змінній S
a=tonumber(S)
за умови, що в ній є числа, і лише числа S
повернуть число, але якщо є будь-які символи, які не є числами (крім періодів для поплавків), він поверне нуль
Чіткіший варіант - використовувати тонумер .
З 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.
Слід зазначити, що 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
Ви можете зробити аксесуар, щоб зберегти "10" як int 10 у ньому.
Приклад:
x = tonumber("10")
якщо ви надрукуєте змінну x, вона видасть int 10, а не "10"
такий же, як процес Python
x = int ("10")
Дякую.
Я б рекомендував перевірити Hyperpolyglot, має приголомшливе порівняння: http://hyperpolyglot.org/
http://hyperpolyglot.org/more#str-to-num-note
пс. Насправді Lua перетворюється в парні, а не в ints.
Тип числа представляє реальні числа з плаваючою комою з подвійною точністю.
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
ось що ви повинні поставити
local stringnumber = "10"
local a = tonumber(stringnumber)
print(a + 10)
output:
20