Lua строка в int


183

Как я могу преобразовать строку в целое число в Lua?

У меня есть такая строка:

a = "10"

Я хотел бы, чтобы это было преобразовано в 10, число.


6
Точная ссылка - раздел о принуждении: 5.1 , 5.2 .
LHF

5
@NicolBolas: +1 за вопрос, который является первым результатом Google и дает прямой ответ.
ereOn

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

Lua просто выполняет автоматическое преобразование между строками и числами. Если вы хотите гарантировать тип, используйте a = tonumber (a).
xpol

Ответы:


299

Используйте tonumberфункцию . Как в a = tonumber("10").


4
В Lua 5.3 целые числа (64-разрядные по умолчанию) обрабатываются соответствующим образом ( lua.org/manual/5.3/manual.html ): «Числовая константа с дробной точкой или показателем степени обозначает число с плавающей точкой; в противном случае оно обозначает целое число».
Кевин Ли

33

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


2
Нет, он преобразует «10» в целое число, а затем добавит к нему 0. (Отсутствие ясности является еще одной причиной для использования tonumberвместо этого!)
Рена

16
@ Рена, нет недостатка в ясности. +всегда является явным дополнением, ..- конкатенация.
Волков Олег Викторович

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

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

Более понятным вариантом является использование tonumber .

Начиная с 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")

Спасибо.


2

Я бы порекомендовал проверить Гиперполиглот, есть отличное сравнение: http://hyperpolyglot.org/

http://hyperpolyglot.org/more#str-to-num-note

пс. На самом деле Lua превращается в двойники, а не в целые.

Тип числа представляет действительные числа (числа с плавающей запятой двойной точности).

http://www.lua.org/pil/2.3.html


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


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

вот что вы должны поставить

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

output:

20

a = tonumber (stringnumber) достаточно
wsha
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.