tav-ui
Version:
277 lines (272 loc) • 7.46 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var lodashEs = require('lodash-es');
var is = require('./is2.js');
function formatNumber(number, decimals = 2, decPoint = ".", thousandsSep = ",") {
if (number === null) {
return "-";
} else if (number === void 0) {
return number;
}
number = `${number}`.replace(/[^0-9+-Ee.]/g, "");
const n = !isFinite(+number) ? 0 : +number;
const toFixedFix = (n2, prec2) => {
const k = 10 ** prec2;
return `${lodashEs.round(n2 * k) / k}`;
};
let prec;
if (decimals == "auto") {
const arr = n.toString().split(".");
if (arr[1] == void 0 || arr[1].length < 2) {
prec = 2;
} else if (arr[1].length > 6) {
prec = 6;
} else {
prec = arr[1].length;
}
} else {
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
}
const s = toFixedFix(n, prec).split(".");
const re = /(-?\d+)(\d{3})/;
while (re.test(s[0])) {
s[0] = s[0].replace(re, `$1${thousandsSep}$2`);
}
if ((s[1] || "").length < prec) {
s[1] = s[1] || "";
s[1] += new Array(prec - s[1].length + 1).join("0");
}
return s.join(decPoint);
}
function numberToChinese(num, chineseMultip = 1, max = 1e12) {
if (is.isNullOrUnDef(num) || typeof num === "string" && /[^\d.]/.test(num)) {
return "";
}
const number = chineseMultiply(Number(num), chineseMultip);
if (number > max) {
return "\u91D1\u989D\u8FC7\u5927\u6682\u4E0D\u652F\u6301";
}
const chineseNums = ["\u96F6", "\u58F9", "\u8D30", "\u53C1", "\u8086", "\u4F0D", "\u9646", "\u67D2", "\u634C", "\u7396"];
const chineseUnits = [
"",
"\u62FE",
"\u4F70",
"\u4EDF",
"\u4E07",
"\u5341",
"\u767E",
"\u5343",
"\u4EBF",
"\u5341",
"\u767E",
"\u5343",
"\u5146",
"\u5341",
"\u767E",
"\u5343",
"\u4EAC",
"\u5341",
"\u767E",
"\u5343",
"\u5793",
"\u5341",
"\u767E",
"\u5343",
"\u79ED",
"\u5341",
"\u767E",
"\u5343"
];
const chineseDecimals = ["\u89D2", "\u5206", "\u5398", "\u6BEB"];
let result = "";
if (number == 0) {
return chineseNums[0];
}
const numStr = number.toString();
const integerPart = numStr.split(".")[0];
const decimalPart = numStr.split(".")[1] || "";
const len = integerPart.length;
let useLastUni = false;
for (let i = 0; i < len; i++) {
const digit = parseInt(integerPart[i]);
const unit = len - i - 1;
if (digit !== 0) {
result += chineseNums[digit] + chineseUnits[unit];
} else {
if (result[result.length - 1] !== chineseNums[0]) {
const lastPart = integerPart.slice(i, integerPart.length - 1);
if (lastPart.length > 3 && Number(lastPart) === 0 && !useLastUni) {
useLastUni = true;
result += chineseUnits[unit - unit % 4];
} else {
result += chineseNums[digit];
}
}
}
}
const decimalLen = decimalPart.length;
if (decimalLen > 0) {
result += "\u5706";
}
for (let i = 0; i < decimalLen; i++) {
const digit = parseInt(decimalPart[i]);
if (digit !== 0) {
result += chineseNums[digit] + (i < chineseDecimals.length ? chineseDecimals[i] : "");
}
}
return lodashEs.trimEnd(result, "\u96F6");
}
function numberToSimpleChinese(num) {
const numbers = ["\u96F6", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u4E03", "\u516B", "\u4E5D"];
const units = ["", "\u5341", "\u767E", "\u5343"];
const bigUnits = ["", "\u4E07", "\u4EBF"];
if (num < 0 || num >= 1e13) {
console.warn("\u6570\u5B57\u592A\u5927");
return "-";
}
if (num === 0)
return numbers[0];
const isNegative = num < 0;
num = Math.abs(num);
const [integer, decimal] = num.toString().split(".");
const convertSection = (section2) => {
let result2 = "";
let unitPos = 0;
let needZero2 = false;
while (section2 > 0) {
const digit = section2 % 10;
if (digit === 0) {
if (needZero2) {
result2 = numbers[0] + result2;
needZero2 = false;
}
} else {
result2 = numbers[digit] + units[unitPos] + result2;
needZero2 = true;
}
unitPos++;
section2 = Math.floor(section2 / 10);
}
return result2;
};
let integerResult = "";
let section = 0;
let sectionPos = 0;
let needZero = false;
let tmp = parseInt(integer);
while (tmp > 0) {
section = tmp % 1e4;
if (section !== 0) {
const sectionStr = convertSection(section);
if (needZero) {
integerResult = numbers[0] + integerResult;
}
integerResult = sectionStr + (section === 0 ? "" : bigUnits[sectionPos]) + integerResult;
needZero = section < 1e3 && section > 0;
}
sectionPos++;
tmp = Math.floor(tmp / 1e4);
}
integerResult = integerResult.replace(/零+$/, "");
integerResult = integerResult.replace(/零+/g, "\u96F6");
integerResult = integerResult.replace(/零([万亿])/g, "$1");
if (integerResult.startsWith("\u4E00\u5341")) {
integerResult = integerResult.substring(1);
}
let decimalResult = "";
if (decimal) {
decimalResult = "\u70B9";
for (const digit of decimal) {
decimalResult += numbers[parseInt(digit)];
}
}
let result = "";
if (isNegative) {
result += "\u8D1F";
}
result += integerResult;
if (decimalResult) {
result += decimalResult;
}
return result || numbers[0];
}
function add(arg1, arg2) {
let r1, r2;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
const c = Math.abs(r1 - r2);
const m = 10 ** Math.max(r1, r2);
if (c > 0) {
const cm = 10 ** c;
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
} else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
} else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return (arg1 + arg2) / m;
}
function subtract(arg1, arg2) {
let r1, r2;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
const m = 10 ** Math.max(r1, r2);
const n = r1 >= r2 ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
function chineseMultiply(arg1, arg2) {
let m = 0;
const s1 = arg1.toString(), s2 = arg2.toString();
try {
m += s1.split(".")[1].length;
} catch (e) {
}
try {
m += s2.split(".")[1].length;
} catch (e) {
}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / 10 ** m;
}
function divide(arg1, arg2) {
let t1 = 0, t2 = 0;
try {
t1 = arg1.toString().split(".")[1].length;
} catch (e) {
}
try {
t2 = arg2.toString().split(".")[1].length;
} catch (e) {
}
const r1 = Number(arg1.toString().replace(".", ""));
const r2 = Number(arg2.toString().replace(".", ""));
return r1 / r2 * 10 ** (t2 - t1);
}
exports.add = add;
exports.chineseMultiply = chineseMultiply;
exports.divide = divide;
exports.formatNumber = formatNumber;
exports.numberToChinese = numberToChinese;
exports.numberToSimpleChinese = numberToSimpleChinese;
exports.subtract = subtract;
//# sourceMappingURL=formatNumber2.js.map