This module contains data on various types of numbers in เวียดนาม.

จำนวน Cardinal เชิงอันดับที่
0 không
1 một thứ nhất
2 hai thứ hai, thứ nhì
3 ba thứ ba
4 bốn thứ tư
5 năm thứ năm
6 sáu thứ sáu
7 bảy, (dialectal) bẩy thứ bảy
8 tám thứ tám
9 chín thứ chín
10 mười, chục thứ mười
11 mười một thứ mười một
12 mười hai thứ mười hai
13 mười ba thứ mười ba
14 mười bốn thứ mười bốn
15 mười lăm thứ mười lăm
16 mười sáu thứ mười sáu
17 mười bảy thứ mười bảy
18 mười tám thứ mười tám
19 mười chín thứ mười chín
20 hai mươi thứ hai mươi
21 hai mươi mốt thứ hai mươi mốt
22 hai mươi hai thứ hai mươi hai
23 hai mươi ba thứ hai mươi ba
24 hai mươi bốn thứ hai mươi bốn
25 hai mươi lăm thứ hai mươi lăm
26 hai mươi sáu thứ hai mươi sáu
27 hai mươi bảy thứ hai mươi bảy
28 hai mươi tám thứ hai mươi tám
29 hai mươi chín thứ hai mươi chín
30 ba mươi thứ ba mươi
31 ba mươi mốt thứ ba mươi mốt
32 ba mươi hai thứ ba mươi hai
33 ba mươi ba thứ ba mươi ba
34 ba mươi bốn thứ ba mươi bốn
35 ba mươi lăm thứ ba mươi lăm
36 ba mươi sáu thứ ba mươi sáu
37 ba mươi bảy thứ ba mươi bảy
38 ba mươi tám thứ ba mươi tám
39 ba mươi chín thứ ba mươi chín
40 bốn mươi thứ bốn mươi
41 bốn mươi mốt thứ bốn mươi mốt
42 bốn mươi hai thứ bốn mươi hai
43 bốn mươi ba thứ bốn mươi ba
44 bốn mươi bốn thứ bốn mươi bốn
45 bốn mươi lăm thứ bốn mươi lăm
46 bốn mươi sáu thứ bốn mươi sáu
47 bốn mươi bảy thứ bốn mươi bảy
48 bốn mươi tám thứ bốn mươi tám
49 bốn mươi chín thứ bốn mươi chín
50 năm mươi thứ năm mươi
51 năm mươi mốt thứ năm mươi mốt
52 năm mươi hai thứ năm mươi hai
53 năm mươi ba thứ năm mươi ba
54 năm mươi bốn thứ năm mươi bốn
55 năm mươi lăm thứ năm mươi lăm
56 năm mươi sáu thứ năm mươi sáu
57 năm mươi bảy thứ năm mươi bảy
58 năm mươi tám thứ năm mươi tám
59 năm mươi chín thứ năm mươi chín
60 sáu mươi thứ sáu mươi
61 sáu mươi mốt thứ sáu mươi mốt
62 sáu mươi hai thứ sáu mươi hai
63 sáu mươi ba thứ sáu mươi ba
64 sáu mươi bốn thứ sáu mươi bốn
65 sáu mươi lăm thứ sáu mươi lăm
66 sáu mươi sáu thứ sáu mươi sáu
67 sáu mươi bảy thứ sáu mươi bảy
68 sáu mươi tám thứ sáu mươi tám
69 sáu mươi chín thứ sáu mươi chín
70 bảy mươi thứ bảy mươi
71 bảy mươi mốt thứ bảy mươi mốt
72 bảy mươi hai thứ bảy mươi hai
73 bảy mươi ba thứ bảy mươi ba
74 bảy mươi bốn thứ bảy mươi bốn
75 bảy mươi lăm thứ bảy mươi lăm
76 bảy mươi sáu thứ bảy mươi sáu
77 bảy mươi bảy thứ bảy mươi bảy
78 bảy mươi tám thứ bảy mươi tám
79 bảy mươi chín thứ bảy mươi chín
80 tám mươi thứ tám mươi
81 tám mươi mốt thứ tám mươi mốt
82 tám mươi hai thứ tám mươi hai
83 tám mươi ba thứ tám mươi ba
84 tám mươi bốn thứ tám mươi bốn
85 tám mươi lăm thứ tám mươi lăm
86 tám mươi sáu thứ tám mươi sáu
87 tám mươi bảy thứ tám mươi bảy
88 tám mươi tám thứ tám mươi tám
89 tám mươi chín thứ tám mươi chín
90 chín mươi thứ chín mươi
91 chín mươi mốt thứ chín mươi mốt
92 chín mươi hai thứ chín mươi hai
93 chín mươi ba thứ chín mươi ba
94 chín mươi bốn thứ chín mươi bốn
95 chín mươi lăm thứ chín mươi lăm
96 chín mươi sáu thứ chín mươi sáu
97 chín mươi bảy thứ chín mươi bảy
98 chín mươi tám thứ chín mươi tám
99 chín mươi chín thứ chín mươi chín
100 một trăm thứ một trăm
1,000 một nghìn, một ngàn thứ một nghìn, thứ một ngàn
10,000 mười nghìn, mười ngàn, một vạn thứ mười nghìn, thứ mười ngàn
100,000 một trăm nghìn, một trăm ngàn, (obsolete) một ứt, (obsolete) một vẹo, (literary) mười vạn thứ một trăm nghìn, thứ một trăm ngàn
1,000,000 (106) một triệu, một trăm vạn thứ một triệu
10,000,000 (107) mười triệu thứ mười triệu
100,000,000 (108) một trăm triệu thứ một trăm triệu
1,000,000,000 (109) một tỉ thứ một tỉ
1012 một nghìn tỉ, một ngàn tỉ thứ một nghìn tỉ, thứ một ngàn tỉ
1015 một triệu tỉ thứ một triệu tỉ
1018 một tỉ tỉ thứ một tỉ tỉ

local export = {}
local m_numutils = require("Module:number list/utils")
local power_of = m_numutils.power_of

export.additional_number_types = {
    { key = "chu_quoc_ngu", display = "[[cardinal number|Cardinal]]", before = "ordinal" },
    { key = "notes", display = "Notes", after = "ordinal" },
}

local numbers = {}
export.numbers = numbers

local ordinal_prefix = "thứ "
local tens_chu_quoc_ngu = "mười "

-- Delete any number types that don't apply.

numbers[0] = {
    chu_quoc_ngu = "không",
}

numbers[1] = {
    chu_quoc_ngu = "một",
    ordinal = "thứ nhất",
}

numbers[2] = {
    chu_quoc_ngu = "hai",
    ordinal = {"thứ hai", "thứ nhì"},
}

numbers[3] = {
    chu_quoc_ngu = "ba",
}

numbers[4] = {
    chu_quoc_ngu = "bốn",
    ordinal = "thứ tư",
}

numbers[5] = {
    chu_quoc_ngu = "năm",
}

numbers[6] = {
    chu_quoc_ngu = "sáu",
}

numbers[7] = {
    chu_quoc_ngu = {"bảy", "bẩy<q:dialectal>"},
}

numbers[8] = {
    chu_quoc_ngu = "tám",
}

numbers[9] = {
    chu_quoc_ngu = "chín",
}

numbers[10] = {
    chu_quoc_ngu = {"mười", "chục",}
}

numbers[20] = {
    chu_quoc_ngu = "hai mươi",
}

numbers[30] = {
    chu_quoc_ngu = "ba mươi",
}

numbers[40] = {
    chu_quoc_ngu = "bốn mươi",
}

numbers[50] = {
    chu_quoc_ngu = "năm mươi",
}

numbers[60] = {
    chu_quoc_ngu = "sáu mươi",
}

numbers[70] = {
    chu_quoc_ngu = "bảy mươi",
}

numbers[80] = {
    chu_quoc_ngu = "tám mươi",
}

numbers[90] = {
    chu_quoc_ngu = "chín mươi",
}

-- Helper function to get the first chữ quốc ngữ
local function get_first_chu_quoc_ngu(number)
    local chu_quoc_ngu = numbers[number].chu_quoc_ngu
    if type(chu_quoc_ngu) == "table" then
        return chu_quoc_ngu[1]
    else
        return chu_quoc_ngu
    end
end

for number = 2, 10 do
    if not numbers[number].ordinal then
        local first_chu_quoc_ngu = get_first_chu_quoc_ngu(number)
        numbers[number].ordinal = ordinal_prefix .. first_chu_quoc_ngu
    end
end

for number = 11, 19 do
    local base_num = number - 10
    numbers[number] = {
        chu_quoc_ngu = m_numutils.map(function(unit)
            if base_num == 5 then
                return tens_chu_quoc_ngu .. "lăm"
            else
                return tens_chu_quoc_ngu .. get_first_chu_quoc_ngu(base_num)
            end
        end, get_first_chu_quoc_ngu(base_num)),
    }
end

for tens = 20, 90, 10 do
    for ones = 1, 9 do
        local num = tens + ones
        if ones == 1 then
            numbers[num] = {
                chu_quoc_ngu = m_numutils.map(function(tens_unit)
                    return tens_unit .. " mốt"
                end, get_first_chu_quoc_ngu(tens)),
            }
        elseif ones == 5 then
            numbers[num] = {
                chu_quoc_ngu = m_numutils.map(function(tens_unit)
                    return tens_unit .. " lăm"
                end, get_first_chu_quoc_ngu(tens)),
            }
        else
            numbers[num] = {
                chu_quoc_ngu = m_numutils.map(function(tens_unit)
                    return tens_unit .. " " .. get_first_chu_quoc_ngu(ones)
                end, get_first_chu_quoc_ngu(tens)),
            }
        end
    end
end

for number = 11, 99 do
    local tens = math.floor(number / 10)
    local ones = number % 10
    if tens == 1 then
        if ones == 5 then
            numbers[number].ordinal = "thứ mười lăm"
        else
            numbers[number].ordinal = "thứ mười " .. get_first_chu_quoc_ngu(ones)
        end
    else
        if ones == 0 then
            numbers[number].ordinal = "thứ " .. get_first_chu_quoc_ngu(tens * 10)
        elseif ones == 1 then
            numbers[number].ordinal = "thứ " .. get_first_chu_quoc_ngu(tens * 10) .. " mốt"
        elseif ones == 5 then
            numbers[number].ordinal = "thứ " .. get_first_chu_quoc_ngu(tens * 10) .. " lăm"
        else
            numbers[number].ordinal = "thứ " .. get_first_chu_quoc_ngu(tens * 10) .. " " .. get_first_chu_quoc_ngu(ones)
        end
    end
end

numbers[100] = {
    chu_quoc_ngu = "một trăm",
    ordinal = "thứ một trăm",
}

numbers[1000] = {
    chu_quoc_ngu = {"một nghìn", "một ngàn"},
    ordinal = {"thứ một nghìn", "thứ một ngàn"},
}

numbers[10000] = {
    chu_quoc_ngu = {"mười nghìn", "mười ngàn", "một vạn"},
    ordinal = {"thứ mười nghìn", "thứ mười ngàn"},
}

numbers[100000] = {
    chu_quoc_ngu = {"một trăm nghìn", "một trăm ngàn", "một ứt<q:obsolete>", "một vẹo<q:obsolete>", "mười vạn<q:literary>"},
    ordinal = {"thứ một trăm nghìn", "thứ một trăm ngàn"},
}

numbers[1000000] = {
    chu_quoc_ngu = {"một triệu", "một trăm vạn"},
    ordinal = "thứ một triệu",
}

numbers[10000000] = {
    chu_quoc_ngu = "mười triệu",
    ordinal = "thứ mười triệu",
}

numbers[100000000] = {
    chu_quoc_ngu = "một trăm triệu",
    ordinal = "thứ một trăm triệu",
}

numbers[1000000000] = {
    chu_quoc_ngu = "một tỉ",
    ordinal = "thứ một tỉ",
}

numbers[10^12] = {
    chu_quoc_ngu = {"một nghìn tỉ", "một ngàn tỉ"},
    ordinal = {"thứ một nghìn tỉ", "thứ một ngàn tỉ"},
}

numbers[10^15] = {
    chu_quoc_ngu = "một triệu tỉ",
    ordinal = "thứ một triệu tỉ",
}

numbers[10^18] = {
    chu_quoc_ngu = "một tỉ tỉ",
    ordinal = "thứ một tỉ tỉ",
}

return export