阿拉伯數字轉國字大寫(網頁書籤版)

工作上偶爾會碰到需要手寫或列印國字金額的業務, 寫錯有點麻煩, 雖然可以上網找國字大寫或列印下來(跟每次寫信封地址很像, 不常用就得上網找範例), 但還要花費個幾秒鐘思考, 想說叫 AI 幫忙找個簡單方案, 就生出個書籤版本(bookmarklet), 只要加入到書籤工作列就可使用, 用 Gemini, ChatGPT, Claude 網頁版反覆檢查撰寫而成, 因為「零」的中文字元在轉換的時候容易出錯, 所以另外處理, 程式碼如下, 另外附上 pretiffy 以後的版本

數字轉中文大寫金額 Bookmarklet

1
javascript:(function()%7Bvar%20s%3Dprompt(%22%E8%AB%8B%E8%BC%B8%E5%85%A5%E6%95%B8%E5%AD%97%EF%BC%9A%22)%3Bif(!s)return%3Btry%7Bvar%20n%3DBigInt(s.replace(%2F%5B%2C%20%5D%2Fg%2C%22%22))%3Bvar%20z0%3DString.fromCharCode(38646)%3Bvar%20d%3Dz0%2B%22%E5%A3%B9%E8%B2%B3%E5%8F%83%E8%82%86%E4%BC%8D%E9%99%B8%E6%9F%92%E6%8D%8C%E7%8E%96%22%2Cu%3D%5B%22%22%2C%22%E6%8B%BE%22%2C%22%E4%BD%B0%22%2C%22%E4%BB%9F%22%5D%2Cb%3D%5B%22%22%2C%22%E8%90%AC%22%2C%22%E5%84%84%22%2C%22%E5%85%86%22%2C%22%E4%BA%AC%22%5D%3Bif(n%3D%3D%3D0n)%7Balert(z0%2B%22%E5%9C%93%E6%95%B4%22)%3Breturn%7Dfunction%20f(m)%7Bvar%20r%3D%22%22%2Cp%3D0%2Cl%3Dfalse%3Bwhile(m%3E0n)%7Bvar%20g%3DNumber(m%2510000n)%3Bif(g%3D%3D%3D0)%7Bif(r!%3D%3D%22%22)l%3Dtrue%7Delse%7Bvar%20t%3D%22%22%2Cv%3Dg%3Bfor(var%20i%3D0%3Bi%3C4%3Bi%2B%2B)%7Bvar%20x%3Dv%2510%3Bif(x%3D%3D%3D0)%7Bif(t!%3D%3D%22%22%26%26t%5B0%5D!%3D%3Dz0)t%3Dz0%2Bt%7Delse%7Bt%3Dd%5Bx%5D%2Bu%5Bi%5D%2Bt%7Dv%3DMath.floor(v%2F10)%7Dif(l)%7Bif(r!%3D%3D%22%22%26%26r%5B0%5D!%3D%3Dz0)r%3Dz0%2Br%3Bl%3Dfalse%7Dr%3Dt%2Bb%5Bp%5D%2Br%7Dm%3Dm%2F10000n%3Bp%2B%2B%7Dreturn%20r.replace(new%20RegExp(%22%5E%22%2Bz0%2B%22%2B%22)%2C%22%22)%7Dvar%20res%3Df(n)%2B%22%E5%9C%93%E6%95%B4%22%3Bprompt(%22%E6%A0%B8%E5%B0%8D%E9%87%91%E9%A1%8D%EF%BC%9A%22%2Bn.toLocaleString()%2B%22%5Cn%E8%BD%89%E6%8F%9B%E6%88%90%E5%8A%9F%EF%BC%81%E6%8C%89%20Ctrl%2BC%20%E8%A4%87%E8%A3%BD%EF%BC%9A%22%2Cres)%7Dcatch(e)%7Balert(%22%E6%A0%BC%E5%BC%8F%E9%8C%AF%E8%AA%A4%22)%7D%7D)()%3B

pretiffy 版本 + 註解

將阿拉伯數字轉換為中文大寫金額的 JavaScript bookmarklet。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(function () {
// 彈出輸入框讓使用者輸入數字
var input = prompt("請輸入數字:");
if (!input) return;

try {
// 移除千分位逗號和空格,轉為 BigInt(處理大整數)
var number = BigInt(input.replace(/[, ]/g, ""));

// 零的繁體中文字元
var zeroChar = String.fromCharCode(38646); // "零"

// 數字 1-9 的中文大寫(不含零)
var digitChars = zeroChar + "壹貳參肆伍陸柒捌玖";

// 位數單位:十、百、千
var positionUnits = ["", "拾", "佰", "仟"];

// 萬以上的大單位:萬、億、兆、京
var magnitudeUnits = ["", "萬", "億", "兆", "京"];

// 輸入為 0 時直接顯示結果並結束
if (number === 0n) {
alert(zeroChar + "圓整");
return;
}

/**
* 將數字轉換為中文大寫金額
* @param {BigInt} num - 要轉換的數字
* @returns {string} 中文大寫金額字串
*/
function convertToChinese(num) {
var result = "";
var magnitudeIndex = 0;
var needZeroPrefix = false; // 是否需要在前面加零

while (num > 0n) {
// 每次處理 4 位數(萬以下的基本單位)
var chunk = Number(num % 10000n);

if (chunk === 0) {
// 如果這段為 0,標記需要補零(除非結果剛好是空的)
if (result !== "") needZeroPrefix = true;
} else {
// 處理 4 位數的每一位
var chunkResult = "";
var temp = chunk;

for (var i = 0; i < 4; i++) {
var digit = temp % 10;

if (digit === 0) {
// 為 0 時:若前面有數字且尚未加零,則補零
if (chunkResult !== "" && chunkResult[0] !== zeroChar) {
chunkResult = zeroChar + chunkResult;
}
} else {
// 不為 0 時:組合數字字符 + 位數單位
chunkResult = digitChars[digit] + positionUnits[i] + chunkResult;
}

temp = Math.floor(temp / 10);
}

// 處理上一段為 0 需要補零的情況
if (needZeroPrefix) {
if (result !== "" && result[0] !== zeroChar) {
result = zeroChar + result;
}
needZeroPrefix = false;
}

// 組合:當前段 + 萬/億/兆/京 + 前面結果
result = chunkResult + magnitudeUnits[magnitudeIndex] + result;
}

num = num / 10000n;
magnitudeIndex++;
}

// 移除開頭多餘的零
return result.replace(new RegExp("^" + zeroChar + "+"), "");
}

var chineseResult = convertToChinese(number) + "圓整";

// 顯示結果對話框(可按 Ctrl+C 複製)
prompt(
"核對金額:" + number.toLocaleString() + "\n轉換成功!按 Ctrl+C 複製:",
chineseResult
);
} catch (e) {
alert("格式錯誤");
}
})();

⚠️ AI Disclosure / 免責聲明

本文部分內容或程式碼由 AI 協作產生,並以 “AS IS” (現狀) 提供,不負任何明示或暗示之擔保責任。讀者在使用、執行或部署前,務必自行驗證其正確性與安全性。作者不對因引用此內容而產生的任何直接或間接損害負責。