UNPKG

number2chinesenumber

Version:

number to chinese number(阿拉伯数字转中文数字,支持大小写)

128 lines (127 loc) 3.75 kB
const b = [ "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "百", "千", "万", "亿", "万亿" ], d = [ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾", "佰", "仟", "万", "亿", "万亿" ], g = ["角", "分", "厘", "元"], A = (a) => /^[-+]?\d{1,16}(\.\d+)?$/.test(a), v = (a, u = "default") => { const e = a.toString(), f = e.indexOf("."); if (f === -1) return ""; let n = e.substring(f + 1); n = n.replace(/0+$/, ""); const r = u === "max" || u === "maxAmount" ? d : b, t = { simple(c) { let s = ""; for (let l = 0; l < c.length; l++) s += r[Number(c[l])]; return s; }, amount(c) { let s = ""; for (let l = 0; l < c.length; l++) { const i = Number(c[l]); i === 0 && !Number(c[l - 1]) || (s += r[i], i !== 0 && l < 3 && (s += g[l])); } return s; } }; return u === "amount" || u === "maxAmount" ? t.amount(n) : t.simple(n); }, O = (a, u = "default") => { if (a > 9999) return ""; const e = u === "max" || u === "maxAmount" ? d : b, f = { ltHundred(n) { if (n <= 10) return e[n]; const r = n / 10 | 0, t = (r > 1 ? e[r] : "") + e[10], c = n % 10; return c === 0 ? t : t + e[c]; }, ltThousand(n) { let r = e[n / 100 | 0] + e[11]; const t = n % 100; return t === 0 ? r : t < 10 ? r + e[0] + e[t] : t >= 10 && t < 20 ? (r += e[1] + e[10], t > 10 && (r += e[t - 10]), r) : r + f.ltHundred(t); }, ltTenThousand(n) { let r = e[n / 1e3 | 0] + e[12]; const t = n % 1e3; return t === 0 ? r : t < 10 ? r + e[0] + e[t] : t < 20 ? (r += e[0] + e[1] + e[10], t > 10 && (r += e[t - 10]), r) : t < 100 ? r + e[0] + f.ltHundred(t) : r + f.ltThousand(t); } }; return a < 100 ? f.ltHundred(a) : a < 1e3 ? f.ltThousand(a) : f.ltTenThousand(a); }, H = (a, u = "default") => { const e = a.toString(); if (!A(e)) return console.warn("The number format is error."), ""; const f = e.split("."), n = Number(f[0].replace(/[+-]/g, "")), r = f[1] ? f[1].substring(0, 3) : "", t = r ? +("." + r) : 0; if (n === 0 && t === 0) return b[0]; const c = u === "max" || u === "maxAmount" ? d : b; let s = ""; const l = { convertInteger() { let i = n.toString(); const m = i.length; m <= 4 ? i = i.padStart(4, "0") : m <= 8 ? i = i.padStart(8, "0") : m <= 12 ? i = i.padStart(12, "0") : i = i.padStart(16, "0"); const S = i.split(/([0-9]{4})/).filter((p) => p !== "").reverse(); let o = ""; return S.forEach((p, x, N) => { const h = Number(p), D = O(h, u), T = Number(N[x - 1]); if (!(!h && !T)) { if (h && T && (T < 1e3 || h % 10 === 0) && (o = c[0] + o), !h) { o = D + o; return; } x === 1 ? o = c[13] + o : x === 2 ? o = c[14] + o : x === 3 && (o = c[15] + o), o = D + o; } }), (u === "amount" || u === "maxAmount") && (o += g[3]), o; }, convertDecimal() { const i = v(t, u); if (u === "default" || u === "max") { s += "点" + i; return; } let m = ""; if (u === "maxAmount" && i.indexOf(g[1]) === -1 && i.indexOf(g[2]) === -1 && (m = "整"), n === 0) { s = i + m; return; } (i.indexOf(g[0]) === -1 || n % 10 === 0) && (s += c[0]), s += i + m; } }; return n !== 0 ? s = l.convertInteger() : s = c[0], e.indexOf("-") > -1 && (n !== 0 || t !== 0) && (s = "负" + s), t === 0 ? (u === "maxAmount" && n && (s += "整"), s) : (l.convertDecimal(), s); }; export { v as decimalToChineseNumber, H as default, O as ltTenThousand };