This module contains data on various types of numbers in ฟินแลนด์.

จำนวน เชิงการนับ Colloquial counting form เชิงอันดับที่ Colloquial ordinal ตัวย่อเชิงอันดับที่ Digit name เชิงกริยาวิเศษณ์ ตัวคูณ เชิงแจกแจง เศษส่วน (⅟…) Wikipedia link
0 nolla nol nollas 0., 0:s nolla 0 (luku)
1 yksi yy ensimmäinen eka, ensin 1., 1:nen ykkönen kerran, (mathematics) yhdesti yksinkertainen yksittäin 1 (luku)
2 kaksi kaa toinen toka 2., 2:nen kakkonen kahdesti kaksinkertainen kaksittain puolikas 2 (luku)
3 kolme koo, kol kolmas kolkki (regional) 3., 3:s kolmonen kolmesti, kolmasti kolminkertainen kolmittain kolmasosa, kolmannes 3 (luku)
4 neljä nee, nel neljäs nelkki (regional) 4., 4:s nelonen neljästi nelinkertainen nelittäin neljäsosa, neljännes 4 (luku)
5 viisi vii viides viikki (regional) 5., 5:s viitonen viidesti viisinkertainen viidesosa, viidennes 5 (luku)
6 kuusi kuu kuudes kuukki (regional) 6., 6:s kuutonen kuudesti kuusinkertainen kuudesosa, kuudennes 6 (luku)
7 seitsemän see, sei seitsemäs seikki (regional), seiska 7., 7:s seiska (informal), seitsikko, seitsemäinen seitsemästi seitsenkertainen seitsemäsosa, seitsemännes 7 (luku)
8 kahdeksan kasi kahdeksas kakki (regional) 8., 8:s kasi (colloquial), kahdeksikko, kahdeksainen kahdeksasti kahdeksankertainen kahdeksasosa, kahdeksannes 8 (luku)
9 yhdeksän ysi yhdeksäs ykki (regional) 9., 9:s ysi (colloquial), yhdeksikkö, yhdeksäinen yhdeksästi yhdeksänkertainen yhdeksäsosa, yhdeksännes 9 (luku)
10 kymmenen kymppi, kybä kymmenes 10., 10:s kymmenesti kymmenkertainen kymmenesosa, kymmenennes 10 (luku)
11 yksitoista yytoo yhdestoista 11., 11:s 11 (luku)
12 kaksitoista kaatoo kahdestoista 12., 12:s 12 (luku)
13 kolmetoista kootoo kolmastoista 13., 13:s 13 (luku)
14 neljätoista neetoo neljästoista 14., 14:s 14 (luku)
15 viisitoista viitoo viidestoista 15., 15:s 15 (luku)
16 kuusitoista kuutoo kuudestoista 16., 16:s 16 (luku)
17 seitsemäntoista seetoo seitsemästoista 17., 17:s 17 (luku)
18 kahdeksantoista kasitoo kahdeksastoista 18., 18:s 18 (luku)
19 yhdeksäntoista ysitoo yhdeksästoista 19., 19:s 19 (luku)
20 kaksikymmentä kakskyt kahdeskymmenes 20., 20:s 20 (luku)
21 kaksikymmentäyksi kahdeskymmenesyhdes, kahdeskymmenesensimmäinen 21., 21:s, 21:nen 21 (luku)
22 kaksikymmentäkaksi kahdeskymmeneskahdes, kahdeskymmenestoinen 22., 22:s, 22:nen 22 (luku)
23 kaksikymmentäkolme kahdeskymmeneskolmas 23., 23:s 23 (luku)
24 kaksikymmentäneljä kahdeskymmenesneljäs 24., 24:s 24 (luku)
25 kaksikymmentäviisi kahdeskymmenesviides 25., 25:s 25 (luku)
26 kaksikymmentäkuusi kahdeskymmeneskuudes 26., 26:s 26 (luku)
27 kaksikymmentäseitsemän kahdeskymmenesseitsemäs 27., 27:s 27 (luku)
28 kaksikymmentäkahdeksan kahdeskymmeneskahdeksas 28., 28:s 28 (luku)
29 kaksikymmentäyhdeksän kahdeskymmenesyhdeksäs 29., 29:s 29 (luku)
30 kolmekymmentä kolkyt kolmaskymmenes 30., 30:s 30 (luku)
31 kolmekymmentäyksi kolmaskymmenesyhdes, kolmaskymmenesensimmäinen 31., 31:s, 31:nen 31 (luku)
32 kolmekymmentäkaksi kolmaskymmeneskahdes, kolmaskymmenestoinen 32., 32:s, 32:nen 32 (luku)
33 kolmekymmentäkolme kolmaskymmeneskolmas 33., 33:s 33 (luku)
34 kolmekymmentäneljä kolmaskymmenesneljäs 34., 34:s 34 (luku)
35 kolmekymmentäviisi kolmaskymmenesviides 35., 35:s 35 (luku)
36 kolmekymmentäkuusi kolmaskymmeneskuudes 36., 36:s 36 (luku)
37 kolmekymmentäseitsemän kolmaskymmenesseitsemäs 37., 37:s 37 (luku)
38 kolmekymmentäkahdeksan kolmaskymmeneskahdeksas 38., 38:s 38 (luku)
39 kolmekymmentäyhdeksän kolmaskymmenesyhdeksäs 39., 39:s 39 (luku)
40 neljäkymmentä nelkyt neljäskymmenes 40., 40:s 40 (luku)
41 neljäkymmentäyksi neljäskymmenesyhdes, neljäskymmenesensimmäinen 41., 41:s, 41:nen 41 (luku)
42 neljäkymmentäkaksi neljäskymmeneskahdes, neljäskymmenestoinen 42., 42:s, 42:nen 42 (luku)
43 neljäkymmentäkolme neljäskymmeneskolmas 43., 43:s 43 (luku)
44 neljäkymmentäneljä neljäskymmenesneljäs 44., 44:s 44 (luku)
45 neljäkymmentäviisi neljäskymmenesviides 45., 45:s 45 (luku)
46 neljäkymmentäkuusi neljäskymmeneskuudes 46., 46:s 46 (luku)
47 neljäkymmentäseitsemän neljäskymmenesseitsemäs 47., 47:s 47 (luku)
48 neljäkymmentäkahdeksan neljäskymmeneskahdeksas 48., 48:s 48 (luku)
49 neljäkymmentäyhdeksän neljäskymmenesyhdeksäs 49., 49:s 49 (luku)
50 viisikymmentä viiskyt viideskymmenes 50., 50:s 50 (luku)
51 viisikymmentäyksi viideskymmenesyhdes, viideskymmenesensimmäinen 51., 51:s, 51:nen 51 (luku)
52 viisikymmentäkaksi viideskymmeneskahdes, viideskymmenestoinen 52., 52:s, 52:nen 52 (luku)
53 viisikymmentäkolme viideskymmeneskolmas 53., 53:s 53 (luku)
54 viisikymmentäneljä viideskymmenesneljäs 54., 54:s 54 (luku)
55 viisikymmentäviisi viideskymmenesviides 55., 55:s 55 (luku)
56 viisikymmentäkuusi viideskymmeneskuudes 56., 56:s 56 (luku)
57 viisikymmentäseitsemän viideskymmenesseitsemäs 57., 57:s 57 (luku)
58 viisikymmentäkahdeksan viideskymmeneskahdeksas 58., 58:s 58 (luku)
59 viisikymmentäyhdeksän viideskymmenesyhdeksäs 59., 59:s 59 (luku)
60 kuusikymmentä kuuskyt kuudeskymmenes 60., 60:s 60 (luku)
61 kuusikymmentäyksi kuudeskymmenesyhdes, kuudeskymmenesensimmäinen 61., 61:s, 61:nen 61 (luku)
62 kuusikymmentäkaksi kuudeskymmeneskahdes, kuudeskymmenestoinen 62., 62:s, 62:nen 62 (luku)
63 kuusikymmentäkolme kuudeskymmeneskolmas 63., 63:s 63 (luku)
64 kuusikymmentäneljä kuudeskymmenesneljäs 64., 64:s 64 (luku)
65 kuusikymmentäviisi kuudeskymmenesviides 65., 65:s 65 (luku)
66 kuusikymmentäkuusi kuudeskymmeneskuudes 66., 66:s 66 (luku)
67 kuusikymmentäseitsemän kuudeskymmenesseitsemäs 67., 67:s 67 (luku)
68 kuusikymmentäkahdeksan kuudeskymmeneskahdeksas 68., 68:s 68 (luku)
69 kuusikymmentäyhdeksän kuudeskymmenesyhdeksäs 69., 69:s 69 (luku)
70 seitsemänkymmentä seiskyt, seitkyt seitsemäskymmenes 70., 70:s 70 (luku)
71 seitsemänkymmentäyksi seitsemäskymmenesyhdes, seitsemäskymmenesensimmäinen 71., 71:s, 71:nen 71 (luku)
72 seitsemänkymmentäkaksi seitsemäskymmeneskahdes, seitsemäskymmenestoinen 72., 72:s, 72:nen 72 (luku)
73 seitsemänkymmentäkolme seitsemäskymmeneskolmas 73., 73:s 73 (luku)
74 seitsemänkymmentäneljä seitsemäskymmenesneljäs 74., 74:s 74 (luku)
75 seitsemänkymmentäviisi seitsemäskymmenesviides 75., 75:s 75 (luku)
76 seitsemänkymmentäkuusi seitsemäskymmeneskuudes 76., 76:s 76 (luku)
77 seitsemänkymmentäseitsemän seitsemäskymmenesseitsemäs 77., 77:s 77 (luku)
78 seitsemänkymmentäkahdeksan seitsemäskymmeneskahdeksas 78., 78:s 78 (luku)
79 seitsemänkymmentäyhdeksän seitsemäskymmenesyhdeksäs 79., 79:s 79 (luku)
80 kahdeksankymmentä kasikyt kahdeksaskymmenes 80., 80:s 80 (luku)
81 kahdeksankymmentäyksi kahdeksaskymmenesyhdes, kahdeksaskymmenesensimmäinen 81., 81:s, 81:nen 81 (luku)
82 kahdeksankymmentäkaksi kahdeksaskymmeneskahdes, kahdeksaskymmenestoinen 82., 82:s, 82:nen 82 (luku)
83 kahdeksankymmentäkolme kahdeksaskymmeneskolmas 83., 83:s 83 (luku)
84 kahdeksankymmentäneljä kahdeksaskymmenesneljäs 84., 84:s 84 (luku)
85 kahdeksankymmentäviisi kahdeksaskymmenesviides 85., 85:s 85 (luku)
86 kahdeksankymmentäkuusi kahdeksaskymmeneskuudes 86., 86:s 86 (luku)
87 kahdeksankymmentäseitsemän kahdeksaskymmenesseitsemäs 87., 87:s 87 (luku)
88 kahdeksankymmentäkahdeksan kahdeksaskymmeneskahdeksas 88., 88:s 88 (luku)
89 kahdeksankymmentäyhdeksän kahdeksaskymmenesyhdeksäs 89., 89:s 89 (luku)
90 yhdeksänkymmentä ysikyt yhdeksäskymmenes 90., 90:s 90 (luku)
91 yhdeksänkymmentäyksi yhdeksäskymmenesyhdes, yhdeksäskymmenesensimmäinen 91., 91:s, 91:nen 91 (luku)
92 yhdeksänkymmentäkaksi yhdeksäskymmeneskahdes, yhdeksäskymmenestoinen 92., 92:s, 92:nen 92 (luku)
93 yhdeksänkymmentäkolme yhdeksäskymmeneskolmas 93., 93:s 93 (luku)
94 yhdeksänkymmentäneljä yhdeksäskymmenesneljäs 94., 94:s 94 (luku)
95 yhdeksänkymmentäviisi yhdeksäskymmenesviides 95., 95:s 95 (luku)
96 yhdeksänkymmentäkuusi yhdeksäskymmeneskuudes 96., 96:s 96 (luku)
97 yhdeksänkymmentäseitsemän yhdeksäskymmenesseitsemäs 97., 97:s 97 (luku)
98 yhdeksänkymmentäkahdeksan yhdeksäskymmeneskahdeksas 98., 98:s 98 (luku)
99 yhdeksänkymmentäyhdeksän yhdeksäskymmenesyhdeksäs 99., 99:s 99 (luku)
100 sata sadas 100., 100:s sadasosa, sadannes 100 (luku)
101 satayksi sadasyhdes, sadasensimmäinen 101., 101:s, 101:nen 101 (luku)
102 satakaksi sadaskahdes, sadastoinen 102., 102:s, 102:nen 102 (luku)
103 satakolme sadaskolmas 103., 103:s 103 (luku)
104 sataneljä sadasneljäs 104., 104:s 104 (luku)
105 sataviisi sadasviides 105., 105:s 105 (luku)
106 satakuusi sadaskuudes 106., 106:s 106 (luku)
107 sataseitsemän sadasseitsemäs 107., 107:s 107 (luku)
108 satakahdeksan sadaskahdeksas 108., 108:s 108 (luku)
109 satayhdeksän sadasyhdeksäs 109., 109:s 109 (luku)
110 satakymmenen sadaskymmenes 110., 110:s 110 (luku)
111 satayksitoista sadasyhdestoista 111., 111:s 111 (luku)
112 satakaksitoista sadaskahdestoista 112., 112:s 112 (luku)
113 satakolmetoista sadaskolmastoista 113., 113:s 113 (luku)
114 sataneljätoista sadasneljästoista 114., 114:s 114 (luku)
115 sataviisitoista sadasviidestoista 115., 115:s 115 (luku)
116 satakuusitoista sadaskuudestoista 116., 116:s
117 sataseitsemäntoista sadasseitsemästoista 117., 117:s
118 satakahdeksantoista sadaskahdeksastoista 118., 118:s
119 satayhdeksäntoista sadasyhdeksästoista 119., 119:s
120 satakaksikymmentä sadaskahdeskymmenes 120., 120:s
121 satakaksikymmentäyksi sadaskahdeskymmenesyhdes, sadaskahdeskymmenesensimmäinen 121., 121:s, 121:nen
200 kaksisataa kahdessadas 200., 200:s
300 kolmesataa kolmassadas 300., 300:s
400 neljäsataa neljässadas 400., 400:s
500 viisisataa viidessadas 500., 500:s
600 kuusisataa kuudessadas 600., 600:s
700 seitsemänsataa seitsemässadas 700., 700:s
800 kahdeksansataa kahdeksassadas 800., 800:s
900 yhdeksänsataa yhdeksässadas 900., 900:s
1,000 tuhat tuhannes 1 000., 1 000:s tuhannesosa, tuhannennes
2,000 kaksituhatta kahdestuhannes 2 000., 2 000:s
3,000 kolmetuhatta kolmastuhannes 3 000., 3 000:s
4,000 neljätuhatta neljästuhannes 4 000., 4 000:s
5,000 viisituhatta viidestuhannes 5 000., 5 000:s
6,000 kuusituhatta kuudestuhannes 6 000., 6 000:s
7,000 seitsemäntuhatta seitsemästuhannes 7 000., 7 000:s
8,000 kahdeksantuhatta kahdeksastuhannes 8 000., 8 000:s
9,000 yhdeksäntuhatta yhdeksästuhannes 9 000., 9 000:s
10,000 kymmenentuhatta kymmenestuhannes 10 000., 10 000:s
20,000 kaksikymmentätuhatta kahdeskymmenestuhannes 20 000., 20 000:s
30,000 kolmekymmentätuhatta kolmaskymmenestuhannes 30 000., 30 000:s
40,000 neljäkymmentätuhatta neljäskymmenestuhannes 40 000., 40 000:s
50,000 viisikymmentätuhatta viideskymmenestuhannes 50 000., 50 000:s
60,000 kuusikymmentätuhatta kuudeskymmenestuhannes 60 000., 60 000:s
70,000 seitsemänkymmentätuhatta seitsemäskymmenestuhannes 70 000., 70 000:s
80,000 kahdeksankymmentätuhatta kahdeksaskymmenestuhannes 80 000., 80 000:s
90,000 yhdeksänkymmentätuhatta yhdeksäskymmenestuhannes 90 000., 90 000:s
100,000 satatuhatta sadastuhannes 100 000., 100 000:s
200,000 kaksisataatuhatta kahdessadastuhannes 200 000., 200 000:s
300,000 kolmesataatuhatta kolmassadastuhannes 300 000., 300 000:s
400,000 neljäsataatuhatta neljässadastuhannes 400 000., 400 000:s
500,000 viisisataatuhatta viidessadastuhannes 500 000., 500 000:s
600,000 kuusisataatuhatta kuudessadastuhannes 600 000., 600 000:s
700,000 seitsemänsataatuhatta seitsemässadastuhannes 700 000., 700 000:s
800,000 kahdeksansataatuhatta kahdeksassadastuhannes 800 000., 800 000:s
900,000 yhdeksänsataatuhatta yhdeksässadastuhannes 900 000., 900 000:s
1,000,000 (106) miljoona miljoonas 1 000 000., 1 000 000:s miljoonasosa, miljoonannes
1,000,000,000 (109) miljardi miljardis
1012 biljoona biljoonas
1015 biljardi biljardis
1018 triljoona triljoonas
1021 triljardi triljardis
1024 kvadriljoona kvadriljoonas
1030 kvintiljoona kvintiljoonas
1036 sekstiljoona sekstiljoonas
1042 septiljoona septiljoonas
1048 oktiljoona oktiljoonas

local export = {numbers = {}}

local numbers = export.numbers

export.additional_number_types = {
	{key = "colloquial_counting_form", after = "cardinal"},
	{key = "colloquial_ordinal", after = "ordinal"},
	{key = "digit_name", after = "ordinal_abbr"},
}

numbers[0] = {
	cardinal = "nolla",
	ordinal = "nollas",
	colloquial_counting_form = "nol",
	digit_name = "nolla",
}

numbers[1] = {
	cardinal = "yksi",
	ordinal = "ensimmäinen",
	adverbial = {"kerran", "yhdesti<q:mathematics>"},
	multiplier = "yksinkertainen",
	distributive = "yksittäin",
	colloquial_counting_form = "yy<id:number>",
	colloquial_ordinal = {"eka", "ensin"},
	digit_name = "ykkönen",
}

numbers[2] = {
	cardinal = "kaksi",
	ordinal = "toinen",
	adverbial = "kahdesti",
	fractional = "puolikas",
	multiplier = "kaksinkertainen",
	distributive = "kaksittain",
	colloquial_counting_form = "kaa",
	colloquial_ordinal = "toka",
	digit_name = "kakkonen",
}

numbers[3] = {
	cardinal = "kolme",
	ordinal = "kolmas",
	adverbial = {"kolmesti", "kolmasti"},
	fractional = {"kolmasosa", "kolmannes"},
	multiplier = "kolminkertainen",
	distributive = "kolmittain",
	colloquial_counting_form = {"koo<id:number>", "kol"},
	colloquial_ordinal = "kolkki<qq:regional>",
	digit_name = "kolmonen",
}

numbers[4] = {
	cardinal = "neljä",
	ordinal = "neljäs",
	adverbial = "neljästi",
	fractional = {"neljäsosa", "neljännes"},
	multiplier = "nelinkertainen",
	distributive = "nelittäin",
	colloquial_counting_form = {"nee", "nel"},
	colloquial_ordinal = "nelkki<qq:regional>",
	digit_name = "nelonen",
}

numbers[5] = {
	cardinal = "viisi",
	ordinal = "viides",
	adverbial = "viidesti",
	fractional = {"viidesosa", "viidennes"},
	multiplier = "viisinkertainen",
	colloquial_counting_form = "vii",
	colloquial_ordinal = "viikki<qq:regional>",
	digit_name = "viitonen",
}

numbers[6] = {
	cardinal = "kuusi<id:number>",
	ordinal = "kuudes",
	adverbial = "kuudesti",
	fractional = {"kuudesosa", "kuudennes"},
	multiplier = "kuusinkertainen",
	colloquial_counting_form = "kuu<id:six>",
	colloquial_ordinal = "kuukki<qq:regional>",
	digit_name = "kuutonen",
}

numbers[7] = {
	cardinal = "seitsemän",
	ordinal = "seitsemäs",
	adverbial = "seitsemästi",
	fractional = {"seitsemäsosa", "seitsemännes"},
	multiplier = "seitsenkertainen",
	colloquial_counting_form = {"see<id:seven>", "sei<id:seven>"},
	colloquial_ordinal = {"seikki<qq:regional>", "seiska"},
	digit_name = {"seiska<qq:informal>", "seitsikko", "seitsemäinen"},
}

numbers[8] = {
	cardinal = "kahdeksan",
	ordinal = "kahdeksas",
	adverbial = "kahdeksasti",
	fractional = {"kahdeksasosa", "kahdeksannes"},
	multiplier = "kahdeksankertainen",
	colloquial_counting_form = "kasi",
	colloquial_ordinal = "kakki<qq:regional>",
	digit_name = {"kasi<id:eight><qq:colloquial>", "kahdeksikko", "kahdeksainen"},
}

numbers[9] = {
	cardinal = "yhdeksän",
	ordinal = "yhdeksäs",
	adverbial = "yhdeksästi",
	fractional = {"yhdeksäsosa", "yhdeksännes"},
	multiplier = "yhdeksänkertainen",
	colloquial_counting_form = "ysi",
	colloquial_ordinal = "ykki<qq:regional>",
	digit_name = {"ysi<qq:colloquial>", "yhdeksikkö", "yhdeksäinen"},
}

numbers[10] = {
	cardinal = "kymmenen",
	ordinal = "kymmenes",
	adverbial = "kymmenesti",
	fractional = {"kymmenesosa", "kymmenennes"},
	multiplier = "kymmenkertainen",
	colloquial_counting_form = {"kymppi", "kybä"},
}

-- Cardinals and ordinals for 11-19 are set down below.
numbers[11] = {
	colloquial_counting_form = "yytoo",
}

numbers[12] = {
	colloquial_counting_form = "kaatoo",
}

numbers[13] = {
	colloquial_counting_form = "kootoo",
}

numbers[14] = {
	colloquial_counting_form = "neetoo",
}

numbers[15] = {
	colloquial_counting_form = "viitoo",
}

numbers[16] = {
	colloquial_counting_form = "kuutoo",
}

numbers[17] = {
	colloquial_counting_form = "seetoo",
}

numbers[18] = {
	colloquial_counting_form = "kasitoo",
}

numbers[19] = {
	colloquial_counting_form = "ysitoo",
}

numbers[20] = {
	colloquial_counting_form = "kakskyt",
}

numbers[30] = {
	colloquial_counting_form = "kolkyt",
}

numbers[40] = {
	colloquial_counting_form = "nelkyt",
}

numbers[50] = {
	colloquial_counting_form = "viiskyt",
}

numbers[60] = {
	colloquial_counting_form = "kuuskyt",
}

numbers[70] = {
	colloquial_counting_form = {"seiskyt", "seitkyt"},
}

numbers[80] = {
	colloquial_counting_form = "kasikyt",
}

numbers[90] = {
	colloquial_counting_form = "ysikyt",
}

numbers[100] = {
	cardinal = "sata",
	ordinal = "sadas",
	fractional = {"sadasosa", "sadannes"},
}

numbers[1000] = {
	cardinal = "tuhat",
	ordinal = "tuhannes",
	fractional = {"tuhannesosa", "tuhannennes"},
}

numbers[1000000] = {
	cardinal = "miljoona",
	ordinal = "miljoonas",
	fractional = {"miljoonasosa", "miljoonannes"},
}

local function power_of(n)
	return "1" .. string.rep("0", n)
end

numbers[power_of(9)] = {
	cardinal = "miljardi",
	ordinal = "miljardis",
}

numbers[power_of(12)] = {
	cardinal = "biljoona",
	ordinal = "biljoonas",
}

numbers[power_of(15)] = {
	cardinal = "biljardi",
	ordinal = "biljardis",
}

numbers[power_of(18)] = {
	cardinal = "triljoona",
	ordinal = "triljoonas",
}

numbers[power_of(21)] = {
	cardinal = "triljardi",
	ordinal = "triljardis",
}

numbers[power_of(24)] = {
	cardinal = "kvadriljoona",
	ordinal = "kvadriljoonas",
}

numbers[power_of(30)] = {
	cardinal = "kvintiljoona",
	ordinal = "kvintiljoonas",
}

numbers[power_of(36)] = {
	cardinal = "sekstiljoona",
	ordinal = "sekstiljoonas",
}

numbers[power_of(42)] = {
	cardinal = "septiljoona",
	ordinal = "septiljoonas",
}

numbers[power_of(48)] = {
	cardinal = "oktiljoona",
	ordinal = "oktiljoonas",
}

local alt_ordinal = { "yhdes", "kahdes" }

local nth_decades = {
	"toista", "kolmatta", "neljättä", "viidettä", "kuudetta",
	"seitsemättä", "kahdeksatta", "yhdeksättä", "kymmenettä"
}

local partitives = {
	[10] = "kymmentä",
	[100] = "sataa",
	[1000] = "tuhatta",
	[1000000] = "miljoonaa",
	[1000000000] = "miljardia",
	[1000000000000] = "biljoonaa"	
}

local MAXIMUM_ONES = 121
local MAXIMUM_FACTORS_MNZ = MAXIMUM_ONES
local MAXIMUM_FACTORS_MT1 = 100000000
local MAXIMUM_FACTORS_ANY = 1000000000

local function set_number(number, cardinal, ordinal)
	if not numbers[number] then
		numbers[number] = {}
	end
	numbers[number].cardinal = cardinal
	numbers[number].ordinal = ordinal
end

local function target_only(items)
	if type(items) == "table" then
		local result = {}
		for _, item in ipairs(items) do
			table.insert(result, target_only(item))
		end
		return result
	else
		if items and items:find("<") then
			return mw.ustring.match(items, "(.-)<")
		else
			return items
		end
	end
end

local function prepend(prefix, items)
	if type(items) == "table" then
		local result = {}
		for _, item in ipairs(items) do
			table.insert(result, prefix .. item)
		end
		return result
	else
		return prefix .. items
	end
end

local function append(items, suffix)
	if type(items) == "table" then
		local result = {}
		for _, item in ipairs(items) do
			table.insert(result, item .. suffix)
		end
		return result
	else
		return items .. suffix
	end
end

local function more_than_one_nonzero(...)
	local count = 0
	for _, v in ipairs(arg) do
		if v ~= 0 then count = count + 1 end
	end
	return count > 1
end

local function make_factor(factor, base, separator)
	local factorbase = factor * base
	local factor_ord = alt_ordinal[factor] or target_only(numbers[factor].ordinal)
	if factorbase > MAXIMUM_FACTORS_ANY then return false end
	set_number(factorbase,
		target_only(numbers[factor].cardinal) .. separator .. partitives[base],
		append(factor_ord, separator .. target_only(numbers[base].ordinal))
	)
	return true
end

local function make_factors(base)
	local separator = base >= 1000000 and " " or ""
	for factor = 2,9 do
		if not make_factor(factor, base, separator) then break end
	end
end

local function past_maximum(base, hundreds, tens, units)
	local factor = hundreds + tens + units
	local factorbase = factor * base
	if factorbase > MAXIMUM_FACTORS_MNZ and more_than_one_nonzero(hundreds, tens, units) then
		return true
	end
	if factorbase > MAXIMUM_FACTORS_MT1 and math.max(hundreds, tens, units) > 1 then
		return true
	end
	return factorbase > MAXIMUM_FACTORS_ANY
end

local function make_factors_tens_hundreds(base)
	local separator = base >= 1000000 and " " or ""
	for hundreds=0,900,100 do
		for tens=0,90,10 do
			if past_maximum(base, hundreds, tens, 0) then break end
			for units=0,9 do
				if past_maximum(base, hundreds, tens, units) then break end
				local factor = hundreds + tens + units
				if factor >= 2 then
					if not make_factor(factor, base, separator) then break end
				end
			end
		end
	end
end

local function make_first_decade(base)
	local separator = base >= 1000 and " " or ""
	for ones = 1,9 do
		if base + ones > MAXIMUM_ONES then break end
		local alt_ord = alt_ordinal[ones]
		set_number(base + ones,
			target_only(numbers[base].cardinal) .. separator .. target_only(numbers[ones].cardinal),
			alt_ord and {
				target_only(numbers[base].ordinal) .. separator .. alt_ord,
				target_only(numbers[base].ordinal) .. separator .. target_only(numbers[ones].ordinal)
			} or target_only(numbers[base].ordinal) .. separator .. target_only(numbers[ones].ordinal)
		)
	end
end

local function make_hundreds()
	local base = 100
	make_factors(base)
	
	for factor = 1,9 do
		local factorbase = factor * base
		if factorbase > MAXIMUM_ONES then break end
		make_first_decade(factorbase)
		for offset = 10,base-1 do
			local n = factorbase + offset
			if n > MAXIMUM_ONES then break end
			set_number(n,
				prepend(target_only(numbers[factorbase].cardinal), target_only(numbers[offset].cardinal)),
				prepend(target_only(numbers[factorbase].ordinal), target_only(numbers[offset].ordinal))
			)
		end
	end
end

local function recurse_down(factorbase, unit)
	make_first_decade(factorbase)
	for offset = 10,999 do
		local n = factorbase + offset * unit
		if n > MAXIMUM_ONES then break end
		set_number(n,
			prepend(target_only(numbers[factorbase].cardinal) .. " ", target_only(numbers[offset].cardinal)),
			prepend(target_only(numbers[factorbase].ordinal) .. " ", target_only(numbers[offset].ordinal))
		)
	end

	if unit >= 1000 then
		for factor = 0,999 do
			local n = factorbase + factor / 1000
			if n > MAXIMUM_ONES then break end
			recurse_down(n, unit / 1000)
		end
	elseif unit ~= 1 then
		error("Illegal state")
	end
end

local function expand_power(power3)
	local base = 1
	for _ = 1,power3 do base = 1000 * base end

	make_factors_tens_hundreds(base)
	for factor = 1,999 do
		recurse_down(factor * base, base / 1000)
	end
end

local function remove_link_if(form)
	return mw.ustring.find(form, " ") and not mw.ustring.find(form, "%[")
end

-- local function separate_links(form)
-- 	if not mw.ustring.find(form, " ") or mw.ustring.find(form, "%[") then
-- 		return form
-- 	end
-- 	if mw.ustring.find(form, "<") then
-- 		local tag_index = mw.ustring.find(form, "<")
-- 		local before_tag, tag = mw.ustring.sub(form, 1, tag_index - 1), mw.ustring.sub(form, tag_index)
-- 		return separate_links(before_tag) .. tag
-- 	end
-- 	if not mw.ustring.find(form, "[^0-9 .-]") then
-- 		-- TODO (delink completely)
-- 		return form
-- 	end
-- 	return mw.ustring.gsub(form, "[a-zåäöšž]+", "[[%1]]") .. "<link:>"
-- end

for ones = 1,9 do
	local one_ord = alt_ordinal[ones] or target_only(numbers[ones].ordinal)
	set_number(10 + ones,
		target_only(numbers[ones].cardinal) .. nth_decades[1],
		one_ord .. nth_decades[1]
	)
end

make_factors(10)
for tens = 20,90,10 do
	make_first_decade(tens)
end

make_hundreds()
expand_power(1)
expand_power(2)

local function make_default_ordinal_abbr(num, data)
	local tbl = { num .. "." }
	local enc = { }
	local function visit(ord)
		local form
		if mw.ustring.match(ord, "nen$") then
			form = num .. ":nen"
		else
			form = num .. ":s"
		end
		if not enc[form] then
			enc[form] = true
			table.insert(tbl, form)
		end
	end
	if type(data.ordinal) == "table" then
		for _, ord in ipairs(data.ordinal) do
			visit(target_only(ord))
		end
	else
		visit(target_only(data.ordinal))
	end
	return tbl
end

for num, data in pairs(numbers) do
	num = tostring(num)
	if #num < 10 then -- skip large numbers
		if #num >= 4 then
			local num_remainder_digits = #num % 3
			local left_remainder_digits = num:sub(1, num_remainder_digits)
			local right_power_of_3_digits = num:sub(1 + num_remainder_digits)
			num = left_remainder_digits .. right_power_of_3_digits:gsub("(...)", " %1")
		end
		data.ordinal_abbr = data.ordinal_abbr or make_default_ordinal_abbr(num, data)
	end
end

local empty_keys = {}
-- remove entries with spaces. we do not want links to them.
for number, form_types in pairs(numbers) do
	for form_type, forms in pairs(form_types) do
		if type(forms) == "string" then
			if remove_link_if(forms) then
				form_types[form_type] = nil
			end
		elseif type(forms) == "table" then
			local source_index = 1
			local source_end = #forms
			local destination_index = 1
			while source_index <= source_end do
				local form = forms[source_index]
				if not remove_link_if(form) then
					forms[destination_index] = form
					destination_index = destination_index + 1
				end
				source_index = source_index + 1
			end
		end
	end
	
	--if not pairs(form_types)(form_types) then
	if not (form_types.cardinal or form_types.ordinal) then
		table.insert(empty_keys, number)
	end
end

for _, number in ipairs(empty_keys) do
	numbers[number] = nil
end

for num = 0,115 do
	numbers[num].wplink = ("%s (luku)"):format(num)
end

return export