تبدیل نوع در لوا

تبدیل بین رشته و عدد با tonumber و tostring و تبدیل خودکار لوا

تبدیل نوع (Type Conversion)

گاهی نیاز داریم مقداری از یک نوع به نوع دیگر تبدیل کنیم — مثلاً عددی که به‌صورت رشته از کاربر گرفته‌ایم را به عدد واقعی تبدیل کنیم تا بتوانیم با آن محاسبه کنیم.

tonumber — رشته به عدد

local n1 = tonumber("42")       -- 42
    local n2 = tonumber("3.14")     -- 3.14
    local n3 = tonumber("  10  ")   -- 10 (فاصله‌ها نادیده گرفته می‌شوند)
    
    -- اگر تبدیل ممکن نباشد: nil
    local bad = tonumber("سلام")
    print(bad)   -- nil
    
    -- تبدیل از مبنای دیگر!
    local hex = tonumber("FF", 16)    -- 255
    local bin = tonumber("1010", 2)   -- 10
    print(hex, bin)

tostring — هر چیزی به رشته

print(tostring(42))       -- "42"
    print(tostring(3.14))     -- "3.14"
    print(tostring(true))     -- "true"
    print(tostring(nil))      -- "nil"

تبدیل خودکار (Coercion)

لوا در برخی موارد خودش تبدیل می‌کند:

-- رشته عددی + عدد = عدد!
    print("10" + 5)      -- 15
    print("3" * "4")     -- 12
    
    -- اما الحاق، عدد را رشته می‌کند
    print("سن: " .. 25)  -- سن: 25
به تبدیل خودکار تکیه نکنید! "10" + 5 کار می‌کند اما "سلام" + 5 خطا می‌دهد. همیشه با tonumber صریح تبدیل کنید و نتیجه را بررسی کنید.

الگوی امن تبدیل

local function safeNumber(s)
      local n = tonumber(s)
      if n then
        return n
      else
        return nil, "عدد معتبر نیست: " .. tostring(s)
      end
    end
    
    local ok, err = safeNumber("123")
    print(ok)        -- 123
    
    local bad, err2 = safeNumber("abc")
    print(bad, err2) -- nil  عدد معتبر نیست: abc

تبدیل عدد به رشته با فرمت

local n = 3.14159
    
    print(tostring(n))                  -- 3.14159
    print(string.format("%.2f", n))     -- 3.14
    print(string.format("%d", 42.7))    -- 42 (گرد می‌شود)

تبدیل boolean به رشته

local flag = true
    print("وضعیت: " .. tostring(flag))   -- وضعیت: true
    
    -- توجه: الحاق مستقیم boolean خطا می‌دهد!
    -- print("وضعیت: " .. true)   -- ❌ خطا!

جدول خلاصه

ازبهروش
رشته عددیعددtonumber("42")
عددرشتهtostring(42)
هر مقداررشتهtostring(x)
هگزادسیمالعددtonumber("FF", 16)
باینریعددtonumber("101", 2)
عددرشته فرمت‌شدهstring.format("%.2f", x)

این مبحث بخشی از دوره آموزش کامل لوا است.

ابزارهای مرتبط