<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://hmoegirl.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ANumberToChinese</id>
	<title>Module:NumberToChinese - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://hmoegirl.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ANumberToChinese"/>
	<link rel="alternate" type="text/html" href="https://hmoegirl.com/index.php?title=Module:NumberToChinese&amp;action=history"/>
	<updated>2026-05-15T02:59:52Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>https://hmoegirl.com/index.php?title=Module:NumberToChinese&amp;diff=74784&amp;oldid=prev</id>
		<title>施瓦本：​创建页面，内容为“local p = {} local calc_lib = {} --用於處理科學記號 local yesno = require(&#039;Module:Yesno&#039;) local function stringToTable(s) --字串轉陣列 	local t = {} 	for i = 1, #s do --將每一個字元存入陣列 		t[i] = s:sub(i, i) 	end 	return t end local ClearTenOne, NoClearOne, ClearAllOne = 0, 1, 2 --清除首位1的狀況，清十前1、不清1、清所有首位1 local Normal, Financial = 0, 1 --小寫和大寫 local Over, Ten, Hundred, Thousand, LargeSt…”</title>
		<link rel="alternate" type="text/html" href="https://hmoegirl.com/index.php?title=Module:NumberToChinese&amp;diff=74784&amp;oldid=prev"/>
		<updated>2023-06-24T15:36:57Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“local p = {} local calc_lib = {} --用於處理科學記號 local yesno = require(&amp;#039;Module:Yesno&amp;#039;) local function stringToTable(s) --字串轉陣列 	local t = {} 	for i = 1, #s do --將每一個字元存入陣列 		t[i] = s:sub(i, i) 	end 	return t end local ClearTenOne, NoClearOne, ClearAllOne = 0, 1, 2 --清除首位1的狀況，清十前1、不清1、清所有首位1 local Normal, Financial = 0, 1 --小寫和大寫 local Over, Ten, Hundred, Thousand, LargeSt…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local calc_lib = {} --用於處理科學記號&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local function stringToTable(s) --字串轉陣列&lt;br /&gt;
	local t = {}&lt;br /&gt;
	for i = 1, #s do --將每一個字元存入陣列&lt;br /&gt;
		t[i] = s:sub(i, i)&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
local ClearTenOne, NoClearOne, ClearAllOne = 0, 1, 2 --清除首位1的狀況，清十前1、不清1、清所有首位1&lt;br /&gt;
local Normal, Financial = 0, 1 --小寫和大寫&lt;br /&gt;
local Over, Ten, Hundred, Thousand, LargeStart = 10, 11, 12, 13, 14 --Over是萬進的節點ID，LargeStart是萬進位數中文的開始ID&lt;br /&gt;
local Data = { --中文數字資料&lt;br /&gt;
	standard = {{&amp;#039;〇&amp;#039;, &amp;#039;一&amp;#039;, &amp;#039;二&amp;#039;, &amp;#039;三&amp;#039;, &amp;#039;四&amp;#039;, &amp;#039;五&amp;#039;, &amp;#039;六&amp;#039;, &amp;#039;七&amp;#039;, &amp;#039;八&amp;#039;, &amp;#039;九&amp;#039;}, {&amp;#039;零&amp;#039;, &amp;#039;壹&amp;#039;, &amp;#039;貳&amp;#039;, &amp;#039;參&amp;#039;, &amp;#039;肆&amp;#039;, &amp;#039;伍&amp;#039;, &amp;#039;陸&amp;#039;, &amp;#039;柒&amp;#039;, &amp;#039;捌&amp;#039;, &amp;#039;玖&amp;#039;}},&lt;br /&gt;
	decimal = {{&amp;#039;&amp;#039;, &amp;#039;十&amp;#039;, &amp;#039;百&amp;#039;, &amp;#039;千&amp;#039;}, {&amp;#039;&amp;#039;, &amp;#039;拾&amp;#039;, &amp;#039;佰&amp;#039;, &amp;#039;仟&amp;#039;}},&lt;br /&gt;
	large = {&amp;#039;&amp;#039;, &amp;#039;萬&amp;#039;, &amp;#039;億&amp;#039;, &amp;#039;兆&amp;#039;, &amp;#039;京&amp;#039;, &amp;#039;垓&amp;#039;, &amp;#039;秭&amp;#039;, &amp;#039;穰&amp;#039;, &amp;#039;溝&amp;#039;, &amp;#039;澗&amp;#039;, &amp;#039;正&amp;#039;, &amp;#039;載&amp;#039;, &amp;#039;極&amp;#039;, &amp;#039;恆河沙&amp;#039;, &amp;#039;阿僧祇&amp;#039;, &amp;#039;那由他&amp;#039;, &amp;#039;不可思議&amp;#039;, &amp;#039;無量&amp;#039;, &amp;#039;大數&amp;#039;},&lt;br /&gt;
	NotANumber = &amp;quot;這不是一個數字&amp;quot;, Infinity = &amp;quot;無窮大&amp;quot;, NumberingZero = &amp;#039;〇&amp;#039;,&lt;br /&gt;
	Positive = &amp;#039;正&amp;#039;, Negative = &amp;#039;負&amp;#039;, Point = &amp;#039;點&amp;#039;, Dash = &amp;#039;之&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
local largeSize = #(Data.large)&lt;br /&gt;
&lt;br /&gt;
local function argsToVariable(frame) --輸入參數陣列轉變數&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
	local number = args.num or args.number or args[1] or 0&lt;br /&gt;
	local numberType = args.b or args.daiji or args.numberType or Normal&lt;br /&gt;
	numberType = tonumber(numberType) or (yesno(numberType) and Financial or Normal)&lt;br /&gt;
	if (numberType &amp;gt; Financial) then&lt;br /&gt;
		numberType = Financial&lt;br /&gt;
	end&lt;br /&gt;
	local clearOne = args.ten or args.clearOne or ClearTenOne&lt;br /&gt;
	clearOne = tonumber(clearOne) or ClearTenOne&lt;br /&gt;
	if (clearOne &amp;gt; ClearAllOne) then&lt;br /&gt;
		clearOne = ClearAllOne&lt;br /&gt;
	end&lt;br /&gt;
	return number, numberType, clearOne&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function IDToChinese(id, numberType) --由上述定義可以知道ID代表意義&lt;br /&gt;
	if id &amp;lt; Over then --小於Over的id即數字本身&lt;br /&gt;
		return Data.standard[numberType + 1][id + 1]&lt;br /&gt;
	elseif id &amp;lt; LargeStart then --Over至LargeStart的id即為萬進前的單位 (如:十、百、千)&lt;br /&gt;
		return Data.decimal[numberType + 1][id - Over + 1]&lt;br /&gt;
	elseif id &amp;lt; LargeStart + largeSize then --萬進後的單位&lt;br /&gt;
		return Data.large[id - LargeStart + 1]&lt;br /&gt;
	else --用完後單位再進位&lt;br /&gt;
		return p.LargeName(id - LargeStart)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function LessThan10000ToID(number) --低於10000的轉換，用途為中文數字是萬進&lt;br /&gt;
	local id = {}&lt;br /&gt;
	table.insert(id, 0) --先丟0讓千位判斷較容易&lt;br /&gt;
	local numberArr = stringToTable(number .. &amp;#039;&amp;#039;)&lt;br /&gt;
	for i = 1, 4 do&lt;br /&gt;
		repeat&lt;br /&gt;
			if id[#id] == 0 and numberArr[i] == &amp;#039;0&amp;#039; then --當連續0的時候直接跳出&lt;br /&gt;
				break&lt;br /&gt;
			elseif id[#id] ~= 0 and numberArr[i] == &amp;#039;0&amp;#039; then --當上一位不是0，目前是0時單純加入0不加入千百十的ID&lt;br /&gt;
				table.insert(id, 0)&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(id, tonumber(numberArr[i])) --其他狀況就照一般說法位數大小和位數名稱&lt;br /&gt;
			table.insert(id, Thousand - i + 1)&lt;br /&gt;
		until true&lt;br /&gt;
	end&lt;br /&gt;
	if numberArr[1] ~= &amp;#039;0&amp;#039; then --如果千位不為0把首位0去除&lt;br /&gt;
		table.remove(id, 1)&lt;br /&gt;
	end&lt;br /&gt;
	if #id &amp;gt; 1 then --只有在0000的時候ID個數才會只有1&lt;br /&gt;
		id[#id] = Over&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(id, Over)&lt;br /&gt;
	end&lt;br /&gt;
	return id&lt;br /&gt;
end&lt;br /&gt;
local function FrontNumberToChinese(number, numberType, clearOne) --這邊的前數指的是大數，但實際英文並非如此稱呼，只是要讓名稱淺顯易懂&lt;br /&gt;
	number = &amp;#039;0000&amp;#039; .. number --把位數補到4的倍數，先補4個0在清除多餘的，下列程式本身有去除首位0的功能，若首位0會自動消除&lt;br /&gt;
	number = number:sub(#number % 4 + 1)&lt;br /&gt;
	local numberLargeLength = #number / 4&lt;br /&gt;
	local id = {}&lt;br /&gt;
	table.insert(id, 0) --先補0讓最高的萬進位數容易判斷&lt;br /&gt;
	for i = 1, numberLargeLength do&lt;br /&gt;
		repeat&lt;br /&gt;
			local data = LessThan10000ToID(number:sub(i * 4 - 3, i * 4 - 3 + 4))&lt;br /&gt;
			if id[#id] == 0 and #data == 2 then --如果上一個萬進位數為0，目前也為0(0000的ID個數最後有加上Over，所以為2)，則直接跳出&lt;br /&gt;
				break&lt;br /&gt;
			elseif id[#id] ~= 0 and #data == 2 then --如果上一個萬進位數不為0，目前為0，補0跳出&lt;br /&gt;
				table.insert(id, 0)&lt;br /&gt;
				break&lt;br /&gt;
			elseif id[#id] == 0 and data[1] == 0 then --如果上一個萬進位數為0，目前的萬進位數首位為0，清除掉首位0&lt;br /&gt;
				table.remove(data, 1)&lt;br /&gt;
			end&lt;br /&gt;
			for j = 1, #data do --將目前的萬進位數加入到ID陣列裡&lt;br /&gt;
				table.insert(id, data[j])&lt;br /&gt;
			end&lt;br /&gt;
			id[#id] = LargeStart + numberLargeLength - i --最後補上萬進位數的ID&lt;br /&gt;
		until true&lt;br /&gt;
	end&lt;br /&gt;
	if #id == 1 then --ID長度為1代表答案是0&lt;br /&gt;
		return IDToChinese(0, numberType)&lt;br /&gt;
	end&lt;br /&gt;
	table.remove(id, 1) --清除首位0&lt;br /&gt;
	table.remove(id, #id) --清除最後一個元素，有可能是萬進位數的第1個空格ID，也有可能是末位0&lt;br /&gt;
	if clearOne == ClearTenOne and id[1] == 1 and id[2] == Ten then --如果是選擇清十前1，則必須首位要是一十才清1&lt;br /&gt;
		table.remove(id, 1)&lt;br /&gt;
	elseif clearOne == ClearAllOne and id[1] == 1 and #id &amp;gt; 1 then --不管如何首位1都清，但是單獨1不清1&lt;br /&gt;
		table.remove(id, 1)&lt;br /&gt;
	end&lt;br /&gt;
	local chinese = &amp;#039;&amp;#039; --轉成中文回傳&lt;br /&gt;
	for i = 1, #id do&lt;br /&gt;
		chinese = chinese .. IDToChinese(id[i], numberType)&lt;br /&gt;
	end&lt;br /&gt;
	return chinese&lt;br /&gt;
end&lt;br /&gt;
local function BackNumberToChinese(number, numberType) --這邊的後數指的是小數，但實際英文並非如此稱呼，只是要讓名稱淺顯易懂&lt;br /&gt;
	local chinese = &amp;#039;&amp;#039;&lt;br /&gt;
	local numberLength = #number&lt;br /&gt;
	local numberArr = stringToTable(number .. &amp;#039;&amp;#039;)&lt;br /&gt;
	while numberLength &amp;gt; 0 do --尋找末位0的個數，並扣除個數&lt;br /&gt;
		if numberArr[numberLength] ~= &amp;#039;0&amp;#039; then&lt;br /&gt;
			break&lt;br /&gt;
		else&lt;br /&gt;
			numberLength = numberLength - 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, numberLength do --直接轉成中文回傳&lt;br /&gt;
		chinese = chinese .. IDToChinese(tonumber(numberArr[i]), numberType)&lt;br /&gt;
	end&lt;br /&gt;
	return chinese&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function NumberToChinese(number, numberType, clearOne) --轉中文&lt;br /&gt;
	number = tostring(number) --轉成字串進行作業&lt;br /&gt;
	Data.standard[Normal + 1][0 + 1] = Data.standard[Financial + 1][0 + 1] --一般數量時大小寫的0皆使用「零」，然後Lua的陣列從1開始&lt;br /&gt;
	local chinese = &amp;#039;&amp;#039;&lt;br /&gt;
	number = mw.ustring.gsub(mw.text.trim(number), &amp;quot;%s+&amp;quot;, &amp;#039;&amp;#039;) --移除空白字元&lt;br /&gt;
	local check_char = mw.ustring.sub(number, 1, 1) --讀取第一個字以便判斷正負號&lt;br /&gt;
	if check_char == &amp;#039;+&amp;#039; then --有正號才顯示正&lt;br /&gt;
		chinese = chinese .. Data.Positive&lt;br /&gt;
		number = mw.ustring.sub(number, 2, #number)&lt;br /&gt;
	elseif check_char == &amp;#039;-&amp;#039; or check_char == &amp;#039;−&amp;#039; then&lt;br /&gt;
		chinese = chinese .. Data.Negative&lt;br /&gt;
		number = mw.ustring.sub(number, 2, #number) --在此階段仍有可能有非ASCII字元，故使用mw.ustring&lt;br /&gt;
	end&lt;br /&gt;
	if number == &amp;#039;∞&amp;#039; or number:lower()==&amp;#039;inf&amp;#039; then&lt;br /&gt;
		chinese = chinese .. Data.Infinity&lt;br /&gt;
		return chinese&lt;br /&gt;
	end&lt;br /&gt;
	if number:lower()==&amp;#039;nan&amp;#039; then --nan會讓tonumber通過，故提前跳出&lt;br /&gt;
		chinese = ((chinese == &amp;#039;&amp;#039;) and Data.Positive or chinese) .. Data.NotANumber&lt;br /&gt;
		return chinese&lt;br /&gt;
	end&lt;br /&gt;
	if number:find(&amp;quot;[%d%.][Ee][%d%+%-]&amp;quot;) then --如果有科學記號&lt;br /&gt;
		if type(calc_lib.scientific2number) ~= type(function()end) then calc_lib = require(&amp;quot;Module:Complex_Number/Calculate&amp;quot;)end&lt;br /&gt;
		number = calc_lib.scientific2number(number) --將科學記號轉換成一般數字&lt;br /&gt;
	end&lt;br /&gt;
	if number:find(&amp;quot;[Ee]&amp;quot;) then return Data.NotANumber end --如果轉換完還有e字元代表非法的科學記號&lt;br /&gt;
	&lt;br /&gt;
	local frontNumber, backNumber = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
	local point = number:find(&amp;#039;%.&amp;#039;)&lt;br /&gt;
	if point == nil then --如果小數點不存在代表只有大數&lt;br /&gt;
		frontNumber = number&lt;br /&gt;
	else --擷取大數部分及小數部分&lt;br /&gt;
		frontNumber = number:sub(1, point - 1)&lt;br /&gt;
		backNumber = number:sub(point + 1, #number)&lt;br /&gt;
	end&lt;br /&gt;
	if tonumber(&amp;#039;0&amp;#039; .. frontNumber) == nil or --lua空字串判斷為非數值，所以一定要至少補1個0&lt;br /&gt;
		tonumber(&amp;#039;0.&amp;#039; .. backNumber .. &amp;#039;0&amp;#039;) == nil then --如果這裡有小數點(變為超過1個小數點)則會誤判為數字，所以一定要補1個&amp;#039;0.&amp;#039;&lt;br /&gt;
		return Data.NotANumber&lt;br /&gt;
	end&lt;br /&gt;
	chinese = chinese .. FrontNumberToChinese(frontNumber, numberType, clearOne)&lt;br /&gt;
	local success, backChinese = pcall(BackNumberToChinese, backNumber, numberType)&lt;br /&gt;
	if not success then return Data.NotANumber end --遺漏的事項會讓轉換的過程出錯；若出錯，則假定其並非一個數字&lt;br /&gt;
	if backChinese ~= &amp;#039;&amp;#039; then --如果小數為空字串則連小數點都不加入中文字串&lt;br /&gt;
		chinese = chinese .. Data.Point .. backChinese&lt;br /&gt;
	end&lt;br /&gt;
	return chinese&lt;br /&gt;
end&lt;br /&gt;
local function NumberToChineseNumbering(number, numberType) --編號用途，編號只敘述數字不敘述進位系統，且有多個「點」和「之」&lt;br /&gt;
	number = tostring(number) --轉成字串進行作業&lt;br /&gt;
	Data.standard[Normal + 1][0 + 1] = Data.NumberingZero --一般編號時小寫的0使用「〇」，然後Lua的陣列從1開始&lt;br /&gt;
	local chinese = &amp;#039;&amp;#039;&lt;br /&gt;
	local numberLength = #number&lt;br /&gt;
	local numberArr = stringToTable(number .. &amp;#039;&amp;#039;)&lt;br /&gt;
	for i = 1, numberLength do&lt;br /&gt;
		if numberArr[i] == &amp;#039;.&amp;#039; then --小數點在編號時中文通常念作「點」&lt;br /&gt;
			chinese = chinese .. Data.Point&lt;br /&gt;
		elseif numberArr[i] == &amp;#039;-&amp;#039; then --減號在編號時中文通常念作「之」&lt;br /&gt;
			chinese = chinese .. Data.Dash&lt;br /&gt;
		elseif tonumber(numberArr[i]) ~= nil then&lt;br /&gt;
			chinese = chinese .. IDToChinese(tonumber(numberArr[i]), numberType)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return chinese&lt;br /&gt;
end&lt;br /&gt;
local function loadInvChineseData()&lt;br /&gt;
	Data.number={[&amp;#039;叄&amp;#039;] = 3, [&amp;#039;叁&amp;#039;] = 3, [&amp;#039;䦉&amp;#039;] = 4, [&amp;#039;兩&amp;#039;] = 2, [&amp;#039;两&amp;#039;] = 2}&lt;br /&gt;
	Data.standard[3] = {&amp;#039;零&amp;#039;, &amp;#039;壹&amp;#039;, &amp;#039;贰&amp;#039;, &amp;#039;参&amp;#039;, &amp;#039;肆&amp;#039;, &amp;#039;伍&amp;#039;, &amp;#039;陆&amp;#039;, &amp;#039;柒&amp;#039;, &amp;#039;捌&amp;#039;, &amp;#039;玖&amp;#039;}&lt;br /&gt;
	Data.standard[4] = {&amp;#039;洞&amp;#039;, &amp;#039;么&amp;#039;, &amp;#039;兩&amp;#039;, &amp;#039;叄&amp;#039;, &amp;#039;肆&amp;#039;, &amp;#039;伍&amp;#039;, &amp;#039;六&amp;#039;, &amp;#039;拐&amp;#039;, &amp;#039;八&amp;#039;, &amp;#039;勾&amp;#039;}&lt;br /&gt;
	Data.otherNumber = {&lt;br /&gt;
		[&amp;#039;廿&amp;#039;] = {addAt = 2, value = 2}, [&amp;#039;念&amp;#039;] = {addAt = 2, value = 2},&lt;br /&gt;
		[&amp;#039;卅&amp;#039;] = {addAt = 2, value = 3},&lt;br /&gt;
		[&amp;#039;卌&amp;#039;] = {addAt = 2, value = 4},&lt;br /&gt;
		[&amp;#039;皕&amp;#039;] = {addAt = 3, value = 2},&lt;br /&gt;
	}&lt;br /&gt;
	local all_large = {Data.large, {&amp;#039;&amp;#039;, &amp;#039;万&amp;#039;, &amp;#039;亿&amp;#039;, &amp;#039;兆&amp;#039;, &amp;#039;京&amp;#039;, &amp;#039;垓&amp;#039;, &amp;#039;秭&amp;#039;, &amp;#039;穰&amp;#039;, &amp;#039;沟&amp;#039;, &amp;#039;涧&amp;#039;, &amp;#039;正&amp;#039;, &amp;#039;载&amp;#039;, &amp;#039;极&amp;#039;, &amp;#039;恒河沙&amp;#039;, &amp;#039;阿僧祇&amp;#039;, &amp;#039;那由他&amp;#039;, &amp;#039;不可思议&amp;#039;, &amp;#039;无量&amp;#039;, &amp;#039;大数&amp;#039;}}&lt;br /&gt;
	Data.less1000={}&lt;br /&gt;
	Data.largeTable = {[&amp;#039;$&amp;#039;] = 1, [Data.Point] = 1, [&amp;#039;点&amp;#039;] = 1}&lt;br /&gt;
	for i=1,#(Data.standard) do --建表以利數字查表&lt;br /&gt;
		for j=1,#(Data.standard[i]) do Data.number[Data.standard[i][j]] = j - 1 end&lt;br /&gt;
	end&lt;br /&gt;
	for i=0,9 do Data.number[tostring(i)] = i end&lt;br /&gt;
	for i=1,#(Data.decimal) do --建表以利單位查表&lt;br /&gt;
		for j=1,#(Data.decimal[i]) do Data.less1000[Data.decimal[i][j]] = j end&lt;br /&gt;
	end&lt;br /&gt;
	Data.maxLarge = 0&lt;br /&gt;
	for i=1,#all_large do --建表以利大數量詞查表&lt;br /&gt;
		for j=1,#(all_large[i]) do &lt;br /&gt;
			if mw.ustring.len(all_large[i][j]) &amp;gt; Data.maxLarge then Data.maxLarge = mw.ustring.len(all_large[i][j]) end&lt;br /&gt;
			Data.largeTable[all_large[i][j]] = j &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
local function FindChineseToken(str, i)&lt;br /&gt;
	local it = mw.ustring.sub(str, i, i)&lt;br /&gt;
	for j=1,Data.maxLarge do --對照表中所有可能長度的子字串&lt;br /&gt;
		local lit = mw.ustring.sub(str, i, i + j)&lt;br /&gt;
		if Data.largeTable[lit] then --如果查表命中&lt;br /&gt;
			it = lit&lt;br /&gt;
			i = i + j&lt;br /&gt;
			break --表示已經找到數字詞彙，跳出&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ((it==&amp;#039;&amp;#039;)and&amp;#039;null&amp;#039;or it), i --查不到返回&amp;#039;null&amp;#039;以利判斷&lt;br /&gt;
end&lt;br /&gt;
local function LoadChineseToken(input_str)&lt;br /&gt;
	local str = input_str..&amp;#039;$&amp;#039; --加入結尾符號&lt;br /&gt;
	local token_list = {}&lt;br /&gt;
	local i, strlen, it, uit = 1, mw.ustring.len(str), &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
	local buffer, buffer_flag = {0,0,0,0}, false --每四位數一個緩衝區&lt;br /&gt;
	while i &amp;lt;= strlen do --逐一數字詞彙查找&lt;br /&gt;
		it, i = FindChineseToken(str, i)&lt;br /&gt;
		uit = it&lt;br /&gt;
		if not(Data.number[it] or Data.otherNumber[it] or Data.less1000[it] or Data.largeTable[it])then&lt;br /&gt;
			if it~=&amp;#039;null&amp;#039;then error(mw.ustring.format(&amp;quot;未知的字元 &amp;#039;%s&amp;#039;&amp;quot;, it), 2)end&lt;br /&gt;
		end&lt;br /&gt;
		if Data.less1000[it] then --單獨的數字量詞(十、百、千)，當作省略了 &amp;quot;一&amp;quot; 的表示方式&lt;br /&gt;
			buffer[Data.less1000[it]] = 1&lt;br /&gt;
			local check_error, err_i = FindChineseToken(str, i + 1)&lt;br /&gt;
			if Data.less1000[check_error] then&lt;br /&gt;
				error(mw.ustring.format(&amp;quot;錯誤的用法 &amp;#039;%s&amp;#039;&amp;quot;, it..check_error), 2)&lt;br /&gt;
			end&lt;br /&gt;
			buffer_flag = true&lt;br /&gt;
		elseif Data.otherNumber[it] then&lt;br /&gt;
			&lt;br /&gt;
			buffer[Data.otherNumber[it].addAt] = Data.otherNumber[it].value&lt;br /&gt;
			local check_error, err_i = FindChineseToken(str, i + 1)&lt;br /&gt;
			if Data.less1000[check_error] then&lt;br /&gt;
				error(mw.ustring.format(&amp;quot;錯誤的用法 &amp;#039;%s&amp;#039;&amp;quot;, it..check_error), 2)&lt;br /&gt;
			end&lt;br /&gt;
			buffer_flag = true&lt;br /&gt;
		elseif Data.number[it] then --讀到數字&lt;br /&gt;
			if Data.number[it] ~= 0 then&lt;br /&gt;
				i = i + 1&lt;br /&gt;
				uit, i = FindChineseToken(str, i) --檢查下一個數字詞彙是否是數字量詞&lt;br /&gt;
				if not(Data.number[uit] or Data.less1000[uit] or Data.largeTable[uit])then&lt;br /&gt;
					if uit~=&amp;#039;null&amp;#039;then error(mw.ustring.format(&amp;quot;未知的字元 &amp;#039;%s&amp;#039;&amp;quot;, uit), 2)end&lt;br /&gt;
				end&lt;br /&gt;
				local check_error, err_i = FindChineseToken(str, i + 1)&lt;br /&gt;
				if Data.less1000[check_error] then&lt;br /&gt;
					error(mw.ustring.format(&amp;quot;錯誤的用法 &amp;#039;%s&amp;#039;&amp;quot;, uit..check_error), 2)&lt;br /&gt;
				end&lt;br /&gt;
				if Data.less1000[uit] then --數字 + 數字量詞 在該位數做紀錄&lt;br /&gt;
					buffer[Data.less1000[uit]] = Data.number[it]&lt;br /&gt;
					buffer_flag = true&lt;br /&gt;
				elseif Data.number[uit] then&lt;br /&gt;
					error(mw.ustring.format(&amp;quot;錯誤的用法 &amp;#039;%s&amp;#039;&amp;quot;, it..uit), 2)&lt;br /&gt;
				else --數字 + 大數量詞 表示本緩衝區(小於1000的子字串)已讀完，儲存token，更新緩衝區&lt;br /&gt;
					buffer[1] = Data.number[it]&lt;br /&gt;
					table.insert(token_list, buffer)&lt;br /&gt;
					buffer = {0,0,0,0}&lt;br /&gt;
					buffer_flag = false&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				local check_next, next_i = FindChineseToken(str, i + 1)&lt;br /&gt;
				if (Data.largeTable[(check_next == &amp;#039;&amp;#039;)and&amp;#039;null&amp;#039;or check_next]) and (not buffer_flag) then&lt;br /&gt;
					buffer[1] = 1 --省略1的寫法&lt;br /&gt;
					buffer_flag = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if Data.largeTable[(uit == &amp;#039;&amp;#039;)and&amp;#039;null&amp;#039;or uit] then --讀到的內容是大數量詞&lt;br /&gt;
			if buffer_flag then --檢查是否有未儲存的緩衝區&lt;br /&gt;
				table.insert(token_list, buffer) --如有未儲存的緩衝區，儲存token，更新緩衝區&lt;br /&gt;
				buffer = {0,0,0,0}&lt;br /&gt;
				buffer_flag = false&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(token_list, Data.largeTable[uit]) --儲存大數量詞id到token表&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	if buffer_flag then --還有未儲存的緩衝區表示有萬未以下的數&lt;br /&gt;
		table.insert(token_list, buffer) --儲存token&lt;br /&gt;
	end&lt;br /&gt;
	if type(token_list[1]) ~= type({}) then --最高位如果本身是大數量詞id，當作省略了 &amp;quot;一&amp;quot; 的表示方式&lt;br /&gt;
		table.insert(token_list, 1, {1,0,0,0})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local loop_count, maxId = #token_list, 0 --準備整理token&lt;br /&gt;
	local result = {}&lt;br /&gt;
	i, buffer_flag = 1, false&lt;br /&gt;
	local last_it = {}&lt;br /&gt;
&lt;br /&gt;
	while i &amp;lt;= loop_count do&lt;br /&gt;
		it = token_list[i]&lt;br /&gt;
		if type(it) == type(0) then --如果是大數量詞id&lt;br /&gt;
			it = it - 1&lt;br /&gt;
			uit = token_list[i + 1] --如果是連續的大數量詞id，將之值相加 (lua陣列以1起始所以減1)&lt;br /&gt;
			while type(uit) == type(0) and i &amp;lt;= loop_count do&lt;br /&gt;
				it = it + uit - 1&lt;br /&gt;
				i = i + 1&lt;br /&gt;
				uit = token_list[i + 1]&lt;br /&gt;
			end&lt;br /&gt;
			it = it + 1 --加回1變成id&lt;br /&gt;
			if it &amp;gt; maxId then maxId = it end --紀錄出現過的最大id&lt;br /&gt;
			result[it] = last_it --在這id位置下儲存解析完的一組4個數位&lt;br /&gt;
			buffer_flag = false&lt;br /&gt;
		else&lt;br /&gt;
			last_it = it&lt;br /&gt;
			buffer_flag = true&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	if buffer_flag then --剩餘萬位以下的一組4個數位&lt;br /&gt;
		result[1] = last_it &lt;br /&gt;
		if 1 &amp;gt; maxId then maxId = 1 end&lt;br /&gt;
	end&lt;br /&gt;
	return result, maxId&lt;br /&gt;
end&lt;br /&gt;
--{{#invoke:NumberToChinese|Chinese_To_Number}}&lt;br /&gt;
function p.Chinese_To_Number(frame)&lt;br /&gt;
	local input_str = ((type(frame)==type({})) and (frame.args or frame) or {tostring(frame) or &amp;quot;&amp;quot;})[1]&lt;br /&gt;
	loadInvChineseData() --建立中文數字查表&lt;br /&gt;
	local str = mw.ustring.gsub(mw.text.trim(input_str), &amp;quot;%s&amp;quot;, &amp;#039;&amp;#039;)&lt;br /&gt;
	if str == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
	local number_pattern = Data.Point..&amp;#039;点%.&amp;#039;&lt;br /&gt;
	local large_pattern = &amp;#039;&amp;#039;&lt;br /&gt;
	local number, sign = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local check_char = mw.ustring.sub(str, 1, 1) --讀取第一個字以便判斷正負號&lt;br /&gt;
	if (check_char == Data.Positive or check_char == &amp;#039;+&amp;#039;) and not (str == Data.Positive) then --有正號才顯示正&lt;br /&gt;
		sign = &amp;#039;+&amp;#039;&lt;br /&gt;
		str = mw.ustring.sub(str, 2, -1)&lt;br /&gt;
	elseif check_char == Data.Negative or check_char == &amp;#039;负&amp;#039; or check_char == &amp;#039;-&amp;#039; or check_char == &amp;#039;−&amp;#039; then&lt;br /&gt;
		sign = &amp;#039;-&amp;#039;&lt;br /&gt;
		str = mw.ustring.sub(str, 2, -1) &lt;br /&gt;
	elseif check_char == &amp;quot;零&amp;quot; then --處理如 &amp;quot;零下三&amp;quot; 的表示方法&lt;br /&gt;
		local check_char = mw.ustring.sub(str..&amp;#039;$$&amp;#039;, 2, 2)&lt;br /&gt;
		if check_char == &amp;quot;上&amp;quot; then&lt;br /&gt;
			sign = &amp;#039;+&amp;#039;&lt;br /&gt;
			str = mw.ustring.sub(str, 3, -1) &lt;br /&gt;
		elseif check_char == &amp;quot;下&amp;quot; then&lt;br /&gt;
			sign = &amp;#039;-&amp;#039;&lt;br /&gt;
			str = mw.ustring.sub(str, 3, -1) &lt;br /&gt;
		end&lt;br /&gt;
		if str == &amp;#039;&amp;#039; then return &amp;quot;0&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
	if str == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end --清完正負號為空表示是空字串&lt;br /&gt;
	if str == p.NotANumber() then return sign .. &amp;#039;nan&amp;#039; end&lt;br /&gt;
	if mw.ustring.match(str,&amp;#039;[無无][穷窮限]&amp;#039;) then return sign .. &amp;#039;inf&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	for name,index in pairs(Data.number) do if type(name) == type(&amp;quot;string&amp;quot;) then number_pattern = number_pattern .. name end end&lt;br /&gt;
	for name,index in pairs(Data.less1000) do if type(name) == type(&amp;quot;string&amp;quot;) then large_pattern = large_pattern .. name end end&lt;br /&gt;
	for name,index in pairs(Data.largeTable) do if type(name) == type(&amp;quot;string&amp;quot;) then large_pattern = large_pattern .. name end end&lt;br /&gt;
	for name,index in pairs(Data.otherNumber) do if type(name) == type(&amp;quot;string&amp;quot;) then large_pattern = large_pattern .. name end end&lt;br /&gt;
	if mw.ustring.match(str, &amp;quot;^[&amp;quot;..number_pattern..&amp;quot;]+$&amp;quot;) then --全部都是數字直接輸出&lt;br /&gt;
		for i=1,mw.ustring.len(str) do&lt;br /&gt;
			local it = mw.ustring.sub(str,i,i)&lt;br /&gt;
			if it == &amp;#039;点&amp;#039; or it == Data.Point then&lt;br /&gt;
				number = number .. &amp;#039;.&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				number = number .. (Data.number[it] or 0)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return sign .. number&lt;br /&gt;
	end&lt;br /&gt;
	local find_invalid, find_invalid_end = mw.ustring.find(str, &amp;quot;[^&amp;quot;..number_pattern..large_pattern..&amp;quot;]+&amp;quot;)&lt;br /&gt;
	if find_invalid then&lt;br /&gt;
		error(mw.ustring.format(&amp;quot;輸入的內容含有無效的詞彙 &amp;#039;%s&amp;#039;&amp;quot;, mw.ustring.sub(str, find_invalid, find_invalid_end)), 2)&lt;br /&gt;
	end&lt;br /&gt;
	local point = mw.ustring.find(str, &amp;quot;[点&amp;quot;..Data.Point..&amp;quot;%.]&amp;quot;)&lt;br /&gt;
	local frontStr, backStr = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
	if point == nil then --如果小數點不存在代表只有大數&lt;br /&gt;
		frontStr = str&lt;br /&gt;
	else --擷取大數部分及小數部分&lt;br /&gt;
		frontStr = mw.ustring.sub(str, 1, point - 1)&lt;br /&gt;
		backStr = mw.ustring.sub(str, point + 1, -1)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tokens, token_len = LoadChineseToken(frontStr)&lt;br /&gt;
	local zero_flag = true&lt;br /&gt;
&lt;br /&gt;
	for i=token_len,1,-1 do&lt;br /&gt;
		for j = 4,1,-1 do&lt;br /&gt;
			local it = (tokens[i]or{})[j] or 0&lt;br /&gt;
			if zero_flag then&lt;br /&gt;
				if it ~= 0 then &lt;br /&gt;
					zero_flag = false&lt;br /&gt;
					number = number .. it&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				number = number .. it&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if backStr ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		number = number .. &amp;#039;.&amp;#039;&lt;br /&gt;
		for i=1,mw.ustring.len(backStr) do&lt;br /&gt;
			local it = mw.ustring.sub(backStr,i,i)&lt;br /&gt;
			if Data.number[it] then&lt;br /&gt;
				number = number .. Data.number[it]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return sign .. number&lt;br /&gt;
end&lt;br /&gt;
function p.NotANumber() return Data.NotANumber end --用於模板內字串判斷&lt;br /&gt;
function p.Infinity() return Data.Infinity end&lt;br /&gt;
function p.LargeName(frame) &lt;br /&gt;
	local index = ((type(frame)==type({})) and (frame.args or frame) or {tonumber(tostring(frame)) or 1})[1]&lt;br /&gt;
	local overlying, quotient = &amp;#039;&amp;#039;, index&lt;br /&gt;
	local remainder = quotient % (largeSize - 1)&lt;br /&gt;
	local largecount = (quotient - remainder) / (largeSize - 1)&lt;br /&gt;
	overlying = Data.large[remainder + 1]&lt;br /&gt;
	for i = 1, largecount do&lt;br /&gt;
		overlying = overlying .. Data.large[largeSize]&lt;br /&gt;
	end&lt;br /&gt;
	return overlying&lt;br /&gt;
end&lt;br /&gt;
--{{#invoke:NumberToChinese|Number_to_Chinese}}&lt;br /&gt;
function p.Number_to_Chinese(frame) --進位系統的中文數字&lt;br /&gt;
	return NumberToChinese(argsToVariable(frame))&lt;br /&gt;
end&lt;br /&gt;
function p.Number_to____(frame) --編號的中文數字&lt;br /&gt;
	return NumberToChineseNumbering(argsToVariable(frame))&lt;br /&gt;
end&lt;br /&gt;
--{{#invoke:NumberToChinese|Number_to_Numbering}}&lt;br /&gt;
function p.Number_to_Numbering(frame) --編號的中文數字&lt;br /&gt;
	return NumberToChineseNumbering(argsToVariable(frame))&lt;br /&gt;
end&lt;br /&gt;
--轉給其他模組使用，但為了避免影響其他運作中模板，改為函數呼叫&lt;br /&gt;
--因此此函數命名遵照[[Wikipedia:Lua代码风格#命名常规]]&lt;br /&gt;
function p._numberToChinese(number, numberType, clearOne)&lt;br /&gt;
	return NumberToChinese(tostring(tostring(number)), numberType or 0, clearOne or 0) --轉中文&lt;br /&gt;
end&lt;br /&gt;
function p._numberToNumbering(number, numberType)&lt;br /&gt;
	return NumberToChinese(tostring(tostring(number)), numberType or 0) --轉中文&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>施瓦本</name></author>
	</entry>
</feed>