优化大数字加分隔符的代码

This commit is contained in:
枫谷剑仙 2024-11-05 12:18:46 +08:00
parent beefcfe1f7
commit 6b723a64f9
2 changed files with 25 additions and 30 deletions

View File

@ -187,7 +187,7 @@ function BigNumberToStringLocalise(separators, splitDigits = 3 ) {
if (splitDigits < 1) throw new RangeError('数字分隔位数至少是1位');
const grouping = 10 ** splitDigits;
separators = separators.map(s=>s.toString());
separators = separators.map(String); //确保所有的分割符都是字符串
return function(options = {}){
const thisValue = this.valueOf();
@ -210,25 +210,24 @@ function BigNumberToStringLocalise(separators, splitDigits = 3 ) {
numLevels.push(numTemp);
}
if (options?.sub) {
let outFragment = document.createDocumentFragment();
if (thisValue < 0) outFragment.append('-');
for (let i = numLevels.length; i--; ) {
if (numLevels[i] > 0) {
const separator = document.createElement("sub");
separator.textContent = separators[i];
outFragment.append(numLevels[i].toString(10), separator);
}
const { sub: useSubElement } = options;
const outArr = [];
if (thisValue < 0) outArr.push('-'); //小于0的添加负号
for (let i = numLevels.length - 1; i >= 0; i--) {
if (numLevels[i] == 0) continue; //如果这一段是0直接不显示
let numberStr = numLevels[i].toString(10);
if (i == numLevels.length - 1) numberStr = numberStr.padStart(i == numLevels.length - 1 ? 1 : splitDigits, "0");
outArr.push(numberStr);
if (useSubElement) {
const separator = document.createElement("sub");
separator.textContent = separators[i];
outArr.push(separator);
} else {
outArr.push(separators[i]);
}
return outFragment;
} else {
let outStr = thisValue < 0 ? '-' : '';
for (let i = numLevels.length; i--; ) {
if (numLevels[i] > 0)
outStr += numLevels[i].toString(10) + separators[i];
}
return outStr.trim();
}
return useSubElement ? outArr.nodeJoin() : outArr.join('').trim();
}
}
Number.prototype.bigNumberToString = BigNumberToStringLocalise(['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'R', 'Q'], 3);
@ -297,20 +296,16 @@ Array.prototype.groupBy = function(func) {
//将内容添加到代码片段
DocumentFragment.prototype.ap = function(...args)
{
args.forEach(arg=>{
if (Array.isArray(arg)) //数组,递归自身
{
arg.forEach(item=>this.ap(item));
}
else if (arg !== null && arg !== void 0) //其他内容的转换为文字添加
{
this.append(arg);
}
}, this);
const items = args.flat(Infinity).filter(item=>item !== null && item !== void 0);
this.append(...items);
return this;
}
//将数组和分隔符添加到一个代码片段类似join
/**
* 将数组和分隔符添加到一个代码片段类似join
* @param {(string | Node)} separator 每个对象之间合并的分割符或代码片段
* @returns {DocumentFragment} 一个文档片段
*/
Array.prototype.nodeJoin = function(separator)
{
const frg = document.createDocumentFragment();

View File

@ -37347,7 +37347,7 @@ const cachesMap = new Map([
],
[
"script-universal_function.js",
"dd8e4ef8d3d4c88c7b4010d11fe86fb1"
"ce03c46f0d40b771ac642490dad87ec7"
],
[
"script.js",