UNPKG

tav-ui

Version:
277 lines (272 loc) 7.46 kB
'use strict'; 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