Chuỗi Lua đến int


182

Làm cách nào tôi có thể chuyển đổi một chuỗi thành một số nguyên trong Lua?

Tôi có một chuỗi như thế này:

a = "10"

Tôi muốn nó được chuyển đổi thành 10, số.


6
Liên kết chính xác là phần cưỡng chế: 5.1 , 5.2 .
lhf

5
@NicolBolas: +1 khi đặt câu hỏi là kết quả đầu tiên của Google và cung cấp câu trả lời thẳng thắn.
vào

2
1 để bù đắp troll này cắn Nicol: D
Петър Петров

Lua chỉ tự động chuyển đổi giữa các chuỗi và số. Nếu bạn muốn đảm bảo loại, sử dụng a = tonumber (a).
xpol

Câu trả lời:



33

Bạn có thể buộc chuyển đổi ngầm bằng cách sử dụng một chuỗi trong các phép toán số học như trong a= "10" + 0, nhưng điều này không hoàn toàn rõ ràng hoặc rõ ràng như sử dụng tonumberrõ ràng.


2
Không, nó sẽ chuyển đổi "10" thành số nguyên và sau đó thêm 0 vào nó. (Tuy nhiên, sự thiếu rõ ràng là lý do để sử dụng nhiều hơn tonumber!)
Rena

16
@Rena, không thiếu sự rõ ràng. +luôn luôn là bổ sung rõ ràng, ..- nối.
Oleg V. Volkov

1
@lhf: tự động ép buộc sẽ chỉ hoạt động trên các số. Và các toán tử so sánh (== ~ = <> <=> =) không chuyển đổi các đối số của chúng. Và vì lý do hiệu suất, bạn nên tránh dựa vào sự ép buộc tự động quá nhiều
wsha

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

Đầu ra

   string                                                                                                                                                                          
   number

8

Tất cả các số trong Lua là số float ( chỉnh sửa: Lua 5.2 trở xuống). Nếu bạn thực sự muốn chuyển đổi thành "int" (hoặc ít nhất là sao chép hành vi này), bạn có thể thực hiện việc này:

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

Trong trường hợp đó, bạn chuyển đổi rõ ràng chuỗi (hoặc thực sự, bất kể đó là gì) thành một số và sau đó cắt bớt số như một (int) cast sẽ làm trong Java.

Chỉnh sửa: Điều này vẫn hoạt động trong Lua 5.3, thậm chí còn nghĩ Lua 5.3 có số nguyên thực, khi math.floor()trả về một số nguyên, trong khi đó một toán tử như number // 1vẫn sẽ trả về một float nếu numberlà float.


5

nói rằng chuỗi bạn muốn biến thành một số nằm trong biến S

a=tonumber(S)

với điều kiện là có số và chỉ có số trong Sđó sẽ trả về một số, nhưng nếu có bất kỳ ký tự nào không phải là số (trừ dấu chấm cho số float) thì nó sẽ trả về nil


4

Tùy chọn rõ ràng hơn là sử dụng tonumber .

Kể từ 5.3.2, chức năng này sẽ tự động phát hiện các số nguyên (đã ký), float (nếu có một điểm) và thập lục phân (cả số nguyên và số float, nếu chuỗi bắt đầu bằng "0x" hoặc "0X").

Các đoạn sau đây ngắn hơn nhưng không tương đương:

  • 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

Cần lưu ý rằng math.floor()luôn luôn làm tròn xuống, và do đó không mang lại kết quả hợp lý cho các giá trị dấu phẩy động âm.

Ví dụ: -10.4 được biểu thị dưới dạng một số nguyên thường sẽ bị cắt ngắn hoặc làm tròn thành -10. Tuy nhiên, kết quả của math.floor () không giống nhau:

math.floor(-10.4) => -11

Để cắt bớt với chuyển đổi loại, chức năng trợ giúp sau sẽ hoạt động:

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

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


2

Bạn có thể tạo một phụ kiện để giữ "10" là int 10 trong đó.

Thí dụ:

x = tonumber("10")

nếu bạn in biến x, nó sẽ xuất ra int 10 chứ không phải "10"

giống như quy trình Python

x = int ("10")

Cảm ơn.



1

tonumber (e [, base])

tonumbernhận hai đối số, đầu tiên là chuỗi được chuyển đổi thành số và thứ hai là cơ sở của e.

Giá trị trả về tonumberlà trong cơ sở 10.

Nếu không baseđược cung cấp, nó chuyển đổi số thành cơ sở 10.

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

Nếu cơ sở được cung cấp, nó chuyển đổi nó thành cơ sở nhất định.

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

Nếu echứa ký tự không hợp lệ thì nó trả về 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

Tôi đã trả lời xem xét 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

đây là những gì bạn nên đặt

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

output:

20

a = tonumber (chuỗi số) là đủ
wsha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.