0Pricing
Lua Academy · บทเรียน

การบังคับและการแปลงชนิดข้อมูล

เรียนรู้การบังคับชนิดข้อมูลอัตโนมัติระหว่างข้อความกับตัวเลข และการใช้ tonumber/tostring อย่างชัดแจ้ง

การบังคับและการแปลงชนิดข้อมูล เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

การบังคับชนิดข้อมูลคืออะไร

การบังคับชนิดข้อมูลคือการแปลงค่าจากชนิดหนึ่งไปเป็นอีกชนิดหนึ่งโดยอัตโนมัติเมื่อบริบทต้องการ Lua ทำการบังคับชนิดข้อมูลในสองทิศทางเฉพาะ ได้แก่ จากสตริงเป็นตัวเลขในบริบทการคำนวณ และ จากตัวเลขเป็นสตริงในบริบทการต่อสตริง

ต่างจาก JavaScript การบังคับชนิดข้อมูลของ Lua มีขอบเขตจำกัดและคาดเดาได้ Lua จะไม่แปลงบูลีนเป็นตัวเลขหรือตารางเป็นสตริงโดยอัตโนมัติ

-- String to number (arithmetic context)
print("10" + 5)     -- 15  (coerced)
print("3.14" * 2)   -- 6.28

-- Number to string (concatenation context)
print(10 .. "px")   -- 10px
print(3.14 .. "!")  -- 3.14!

-- No boolean coercion
-- print(true + 1)  -- ERROR!

กฎการบังคับชนิดข้อมูลจากสตริงเป็นตัวเลข

เมื่อสตริงปรากฏในนิพจน์เลขคณิต Lua จะพยายามแปลงสตริงนั้นเป็นตัวเลข หากสตริงไม่ใช่ตัวเลขที่ถูกต้อง จะเกิดข้อผิดพลาดขณะทำงาน สตริงตัวเลขที่ถูกต้องได้แก่ จำนวนเต็ม ("42") จำนวนทศนิยม ("3.14") เลขฐานสิบหก ("0xff") และสัญกรณ์วิทยาศาสตร์ ("1e3")

สตริงที่มีช่องว่างด้านหน้าหรือด้านท้ายสามารถใช้ได้ Lua จะตัดช่องว่างเหล่านั้นออกระหว่างการบังคับชนิดข้อมูล

print("42" + 0)      -- 42    (integer)
print("3.14" + 0)    -- 3.14  (float)
print("0xff" + 0)    -- 255   (hex)
print("  10  " + 0)  -- 10    (whitespace ok)
print("1e3" + 0)     -- 1000.0

-- This will error:
-- print("hello" + 0)  -- attempt to perform arithmetic on a string value

การบังคับชนิดข้อมูลจากตัวเลขเป็นสตริง

เมื่อคุณนำตัวเลขมาต่อกับ .. Lua จะแปลงตัวเลขนั้นเป็นสตริงโดยอัตโนมัติ จำนวนเต็มจะกลายเป็นรูปแบบเลขฐานสิบ ส่วนจำนวนทศนิยมอาจมีตำแหน่งทศนิยมเพิ่มขึ้น หากต้องการควบคุมรูปแบบอย่างแม่นยำ โปรดใช้ tostring() หรือ string.format() เสมอ แทนการพึ่งพาการบังคับชนิดข้อมูลโดยปริยาย

print(10 .. "!")       -- 10!
print(3.14 .. "!")     -- 3.14!
print(1/3 .. "!")      -- 0.33333333333333!

-- Explicit is better for precision
print(string.format("%.2f", 1/3))  -- 0.33
print(tostring(10))                -- 10
print(tostring(10.0))              -- 10.0

tonumber(): การแปลงชนิดข้อมูลอย่างชัดเจน

tonumber(v) จะแปลงค่าเป็นตัวเลขอย่างชัดเจน เมื่อสำเร็จจะคืนค่าตัวเลขที่แปลงแล้ว หรือคืนค่า nil หากแปลงไม่สำเร็จ โดยจะไม่ทำให้เกิดข้อผิดพลาด สามารถระบุฐานเสริม (2–36) สำหรับการแยกวิเคราะห์จำนวนเต็ม เพื่อรองรับการแปลงเลขฐานสอง ฐานแปด และฐานสิบหก

โปรดตรวจสอบค่าที่คืนจาก tonumber() ว่าเป็น nil หรือไม่เสมอเมื่อประมวลผลข้อมูลนำเข้าจากผู้ใช้

print(tonumber("42"))      -- 42
print(tonumber("3.14"))    -- 3.14
print(tonumber("0xFF"))    -- 255
print(tonumber("hello"))   -- nil (no error!)
print(tonumber(true))      -- nil

-- Base conversion
print(tonumber("ff", 16))  -- 255
print(tonumber("11", 2))   -- 3   (binary)
print(tonumber("77", 8))   -- 63  (octal)

tostring(): การแปลงชนิดข้อมูลอย่างชัดเจน

tostring(v) จะแปลงค่าใด ๆ เป็นสตริง สำหรับตัวเลข จะสร้างสตริงในรูปแบบเลขฐานสิบหรือสัญกรณ์วิทยาศาสตร์ สำหรับบูลีน จะสร้างค่า "true" หรือ "false" สำหรับ nil จะคืนค่า "nil" สำหรับตารางและฟังก์ชัน จะคืนค่าที่อยู่ในรูปแบบ "table: 0x..." เว้นแต่จะกำหนดเมทาเมธอด __tostring ไว้

print(tostring(42))         -- 42
print(tostring(3.14))       -- 3.14
print(tostring(true))       -- true
print(tostring(false))      -- false
print(tostring(nil))        -- nil
print(tostring({}))         -- table: 0x...

-- Useful for safe concatenation
local val = nil
local msg = "Value: " .. tostring(val)
print(msg)   -- Value: nil

math.tointeger()

math.tointeger(x) (Lua 5.3 ขึ้นไป) จะแปลงค่าทศนิยมเป็นจำนวนเต็มก็ต่อเมื่อค่านั้นมีรูปแทนเป็นจำนวนเต็มอย่างพอดี หากการแปลงทำให้สูญเสียความแม่นยำ จะคืนค่า nil วิธีนี้ปลอดภัยกว่า math.floor() ซึ่งสำเร็จเสมอ แต่อาจตัดเศษทิ้งโดยไม่แจ้งให้ทราบ

ใช้วิธีนี้เมื่อจำเป็นต้องตรวจสอบจำนวนเต็มอย่างเคร่งครัด เช่น เมื่อติดต่อกับ API ที่ต้องการจำนวนเต็มที่ถูกต้องอย่างพอดี

print(math.tointeger(5.0))   -- 5   (exact)
print(math.tointeger(5.5))   -- nil (not exact)
print(math.tointeger(2^53))  -- 9007199254740992

-- Contrast with math.floor
print(math.floor(5.9))       -- 5   (truncates)
print(math.floor(5.0))       -- 5

-- Check before use
local n = math.tointeger(val) or error("need integer")

การบังคับชนิดข้อมูลในการเปรียบเทียบ

Lua จะไม่บังคับชนิดข้อมูลสำหรับการเปรียบเทียบความเท่ากัน 1 == "1" จะเป็น false เสมอ เพราะตัวถูกดำเนินการมีชนิดต่างกัน อย่างไรก็ตาม ตัวดำเนินการเปรียบเทียบลำดับ (<, > และอื่น ๆ) จะกระตุ้นการบังคับชนิดข้อมูลระหว่างสตริงกับตัวเลข แต่จะทำได้ก็ต่อเมื่อตัวถูกดำเนินการทั้งสองมีชนิดเดียวกัน การผสมชนิดข้อมูลในการเปรียบเทียบลำดับจะทำให้เกิดข้อผิดพลาด

print(1 == "1")    -- false (no coercion)
print(1 == 1.0)    -- true  (int/float equal)

-- Ordering: same type only
print("abc" < "abd")  -- true (string compare)
print(1 < 2)          -- true (number compare)

-- This ERRORS: mixing string and number
-- print(1 < "2")  -- attempt to compare number with string

ภาคปฏิบัติ: การแยกวิเคราะห์ข้อมูลนำเข้าจากผู้ใช้

รูปแบบที่พบได้บ่อยมากในโปรแกรม Lua คือการอ่านสตริงจากข้อมูลนำเข้าของผู้ใช้ (เช่น ผ่าน io.read()) แล้วแปลงเป็นตัวเลข โปรดใช้ tonumber() และตรวจสอบค่า nil เสมอ เพื่อจัดการข้อมูลนำเข้าที่ไม่ถูกต้องอย่างเหมาะสมแทนการปล่อยให้โปรแกรมหยุดทำงาน

-- Safe input parsing pattern
local function parseNumber(input)
  local n = tonumber(input)
  if n == nil then
    return nil, "Invalid number: " .. tostring(input)
  end
  return n, nil
end

local val, err = parseNumber("42")
print(val, err)   -- 42  nil

local val2, err2 = parseNumber("abc")
print(val2, err2) -- nil  Invalid number: abc

ข้อควรระวังด้านความแม่นยำของจำนวนเต็มและทศนิยม

จำนวนทศนิยมมีความแม่นยำจำกัด การดำเนินการที่ผสมจำนวนเต็มกับจำนวนทศนิยมอาจให้ผลลัพธ์ที่ไม่คาดคิด เนื่องจากการแทนค่าตาม IEEE 754 จำนวนเต็มที่มีค่ามากที่สุดซึ่งสามารถแทนได้อย่างแม่นยำในรูปแบบ double คือ 2^53 = 9,007,199,254,740,992 จำนวนเต็มที่มากกว่านี้จะสูญเสียความแม่นยำเมื่อจัดเก็บเป็นจำนวนทศนิยม

ใน Lua 5.3 ขึ้นไป จำนวนเต็ม 64 บิตในตัวรองรับค่าที่ถูกต้องอย่างพอดีได้ถึง 2^63-1 ซึ่งมากกว่ามาก โปรดใช้การคำนวณด้วยจำนวนเต็มเมื่อความถูกต้องแม่นยำเป็นสิ่งสำคัญ

-- Float precision limit
print(2^53)            -- 9.007...e+15
print(2^53 + 1 == 2^53) -- true (precision lost!)

-- Integer stays exact
local big = math.maxinteger
print(big)             -- 9223372036854775807
print(math.type(big))  -- integer

-- Mixing promotes to float
print(math.type(1 + 1.0))  -- float

การแปลงรูปแบบสตริง

string.format() เป็นเครื่องมือที่ทรงพลังที่สุดสำหรับการแปลงตัวเลขเป็นสตริงเมื่อคุณต้องการควบคุมความแม่นยำ การเติมช่องว่างหรือเลขศูนย์ และสัญกรณ์ เครื่องมือนี้ใช้ตัวระบุรูปแบบของ printf ในภาษา C โปรดใช้สำหรับการแสดงผล การเขียนข้อมูลลงไฟล์ และทุกกรณีที่รูปแบบเริ่มต้นของ tostring() ไม่เพียงพอ

print(string.format("%d", 255))      -- 255
print(string.format("%x", 255))      -- ff
print(string.format("%05d", 42))     -- 00042
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%e", 12345.0))  -- 1.234500e+04
print(string.format("%s=%d", "x", 10)) -- x=10

ตรวจสอบอย่างรวดเร็ว

ใน Lua tonumber("hello") คืนค่าอะไร

ทบทวน: การบังคับและการแปลงชนิดข้อมูล

สิ่งที่คุณได้เรียนรู้:

  • Lua บังคับชนิดข้อมูลจากสตริงเป็นตัวเลขโดยอัตโนมัติในการคำนวณ และจากตัวเลขเป็นสตริงในการต่อสตริง
  • tonumber() คืนค่า nil เมื่อแปลงไม่สำเร็จ โปรดตรวจสอบเสมอ
  • tostring() แปลงค่าใด ๆ เป็นสตริงได้อย่างปลอดภัย
  • การเปรียบเทียบความเท่ากัน (==) จะไม่บังคับชนิดข้อมูล ชนิดต่างกันย่อมไม่เท่ากัน
  • ใช้ string.format() เพื่อจัดรูปแบบตัวเลขอย่างแม่นยำ
  • จำนวนทศนิยมมีขีดจำกัดด้านความแม่นยำที่ 2^53 ให้ใช้จำนวนเต็มในตัวสำหรับค่าขนาดใหญ่ที่ต้องการความถูกต้อง

ถัดไป: การควบคุมลำดับการทำงานด้วย if/elseif/else และลูป

คำถามที่พบบ่อย

บทเรียน “การบังคับและการแปลงชนิดข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การบังคับและการแปลงชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การบังคับและการแปลงชนิดข้อมูล”

เรียนรู้การบังคับชนิดข้อมูลอัตโนมัติระหว่างข้อความกับตัวเลข และการใช้ tonumber/tostring อย่างชัดแจ้ง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การบังคับและการแปลงชนิดข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวมชนิดข้อมูลของ Lua
  2. การประกาศตัวแปรใน Lua
  3. ตัวดำเนินการเลขคณิตและความสัมพันธ์
  4. การบังคับและการแปลงชนิดข้อมูล
← กลับไปที่ Lua Academy