number2chinesenumber
Version:
number to chinese number(阿拉伯数字转中文数字,支持大小写)
128 lines (127 loc) • 3.75 kB
JavaScript
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
};