สตริง Lua ถึง 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

คำตอบ:


299

ใช้ฟังก์ชั่นtonumber a = tonumber("10")ในฐานะที่เป็น


4
ใน Lua 5.3 จำนวนเต็ม (ค่าเริ่มต้น 64- บิต) จะได้รับการปฏิบัติตาม ( lua.org/manual/5.3/manual.html ): "ค่าคงที่ตัวเลขที่มีจุดเศษส่วนหรือเลขชี้กำลังเป็นทศนิยมมิฉะนั้นจะแสดงจำนวนเต็ม"
Kevin Lee

33

คุณสามารถบังคับให้มีการแปลงโดยนัยโดยใช้สตริงในการดำเนินการทางคณิตศาสตร์เช่นเดียวกับในa= "10" + 0แต่ไม่ชัดเจนหรือสะอาดเท่าการใช้tonumberอย่างชัดเจน


2
ไม่มันจะแปลง "10" เป็นจำนวนเต็มแล้วเพิ่ม 0 ลงไป (การขาดความชัดเจนเป็นเหตุผลมากกว่าที่จะใช้tonumberแทน!)
Rena

16
@Rena ไม่มีการขาดความชัดเจน +จะเพิ่มอย่างชัดเจนเสมอ..- การต่อข้อมูล
Oleg V. Volkov

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

ตัวเลือกที่ชัดเจนคือการใช้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

คุณสามารถสร้าง accessor เพื่อให้ "10" เป็น int 10 ได้

ตัวอย่าง:

x = tonumber("10")

ถ้าคุณพิมพ์ตัวแปร x มันจะออก int 10 และไม่ใช่ "10"

เหมือนกับกระบวนการ Python

x = int ("10")

ขอบคุณ


2

ฉันขอแนะนำให้ตรวจสอบ Hyperpolyglot มีการเปรียบเทียบที่ยอดเยี่ยม: http://hyperpolyglot.org/

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

PS ที่จริงแล้วลัวะเปลี่ยนเป็นคู่ไม่เป็น ints

ประเภทหมายเลขแสดงถึงจำนวนจริง (ทศนิยมสองตำแหน่งที่แม่นยำ)

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


1

tonumber (e [, base])

tonumbereใช้เวลาสองอาร์กิวเมนต์แรกคือสตริงซึ่งจะถูกแปลงเป็นตัวเลขและตัวที่สองเป็นฐานของ

ค่าส่งคืน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
> 

หากมีตัวอักษรที่ไม่ถูกต้องจากนั้นก็จะส่งกลับenil

> --[[ 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



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.