yzf-number-format
Version:
数字格式化
216 lines (208 loc) • 7.58 kB
JavaScript
const shuziFn = (num) => {
if (!/^\d*(\.\d*)?$/.test(num)) { alert("Number is wrong!"); return "Number is wrong!"; } // eslint-disable-line
const AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九"); // eslint-disable-line
const BB = new Array("", "十", "百", "千", "万", "亿", "点", ""); // eslint-disable-line
const a = (`${num}`).replace(/(^0*)/g, "").split("."); // eslint-disable-line
let k = 0;
let re = '';
for (let i = a[0].length - 1; i >= 0; i--) { // eslint-disable-line
switch (k) { // eslint-disable-line
case 0: re = BB[7] + re; break;
case 4: if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0])) // eslint-disable-line
re = BB[4] + re; break;
case 8: re = BB[5] + re; BB[7] = BB[5]; k = 0; break;
}
if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re; // eslint-disable-line
if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re; k++; // eslint-disable-line
}
if (a.length > 1) { // eslint-disable-line
re += BB[6];
for (let i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)]; // eslint-disable-line
}
return re;
};
const susi = (val, baifenbi) => {
let outData = 0;
if (val) {
const sz = parseFloat(val);
if (baifenbi) {
if (`${sz}` === 'NaN') {
outData = val;
} else {
const sz1 = sz * 100;
let nowLength = `${sz1}`.indexOf('.') !== -1 ? `${sz1.toFixed(2)}` : `${sz1}`;
let nowLength2 = '';
let nowLength3 = '';
nowLength.replace(/(.+)(\.\d+$)/g, ($0, $1, $2) => {
nowLength2 = `${$1}`;
nowLength3 = $2;
return $0;
});
if (!nowLength3) {
nowLength2 = nowLength;
}
nowLength = nowLength2.replace(/(\d{1,3})(?=(\d{3})+$)/g, ($1) => {
return $1 = $1 + ','; // eslint-disable-line
});
outData = nowLength + nowLength3 + '%';
}
} else {
if (`${sz}` === 'NaN') {
outData = val;
} else {
let nowLength = `${sz}`.indexOf('.') !== -1 ? `${sz.toFixed(2)}` : `${sz}`;
let nowLength2 = '';
let nowLength3 = '';
nowLength.replace(/(.+)(\.\d+$)/g, ($0, $1, $2) => {
nowLength2 = `${$1}`;
nowLength3 = $2;
return $0;
});
if (!nowLength3) {
nowLength2 = nowLength;
}
nowLength = nowLength2.replace(/(\d{1,3})(?=(\d{3})+$)/g, ($1) => {
return $1 = $1 + ','; // eslint-disable-line
});
outData = nowLength + nowLength3 + '';
}
}
} else if (baifenbi) {
outData = '0%';
}
return outData;
};
const NFormat = (value, format) => { // 数字Filter
const Str = `${value}`;
try{
let outData = Str;
if (!outData) return
let onoff = false;
// 显示百分比提前处理
if (format.search(/0%$/) !== -1) { // 显示百分比
outData = parseFloat(Str*100);
}
// 数值处理
let Len = 0;
let kOnoff = false;
const Ze1 = /^([\+|-]?)0([%|z|k|w|m|b]?)$/;
const Ze = /^([\+|-]?)(0,)?0.(0+)([%|k|w|m|b|z]?)$/;
if (format.search(Ze1) !== -1) { // 取整,不要小数
onoff = true;
outData = parseInt(Str);
} else if (format.search(Ze) !== -1) {
onoff = true;
format.replace(Ze, ($1, $2, $3, $4, $5) => {
Len = $4.length; // 保留几位小数
if ($1 === '0,0' || $1 === '0,0%' || $1 === '0,0k' || $1 === '0,0w' || $1 === '0,0m' || $1 === '0,0b' || $1 === '0,0z') {
kOnoff = true;
Len = 0;
}
if ($3) { // 是否有,.
kOnoff = true;
}
outData = `${parseFloat(outData).toFixed(Len)}`;
});
}
if (!kOnoff) {
// 尾部处理
if (format.search(/z$/) !== -1) { // 中式格式化
outData = shuziFn(parseFloat(outData));
} else if (format.search(/k$/) !== -1) { // 只以千为单位
outData = `${parseFloat(outData/1000).toFixed(Len)}千`;
} else if (format.search(/w$/) !== -1) { // 只以万为单位
outData = `${parseFloat(outData/10000).toFixed(Len)}万`;
} else if (format.search(/m$/) !== -1) { // 只以百万为单位
outData = `${parseFloat(outData/1000000).toFixed(Len)}百万`;
} else if (format.search(/b$/) !== -1) { // 只以十亿为单位
outData = `${parseFloat(outData/1000000000).toFixed(Len)}十亿`;
} else if (format.search(/0%$/) !== -1) { // 显示百分比
outData = `${parseFloat(outData).toFixed(Len)}%`;
}
} else { // 千分用,隔开
if (format.search(/0%$/) !== -1) { // 显示百分比
const outData2 = susi(parseInt(outData));
var a = `${parseFloat(outData)}`;
var b = a.split(".");
var y = `${parseFloat(`0.${b[1]}`).toFixed(Len)}`.split(".")[1];
outData = `${outData2}.${y}%`;
} else {
const outData2 = susi(parseInt(outData));
if (Len) {
var a = `${parseFloat(outData)}`;
var b = a.split(".");
var y = `${parseFloat(`0.${b[1]}`).toFixed(Len)}`.split(".")[1];
outData = `${outData2}.${y}`;
} else {
outData = `${outData2}`;
}
}
}
// 头部处理
const A = parseFloat(value);
if (format.search(/^\+0/) !== -1) {
if (format.search(/z$/) !== -1) {
if (A > 0) {
outData = `正${outData}`;
} else {
outData = `${outData}`;
}
} else {
if (A > 0) {
outData = `+${outData}`;
} else {
outData = `${outData}`;
}
}
} else if (format.search(/^-0/) !== -1) { // 中式格式化,单位有 万、亿、兆
if (format.search(/z$/) !== -1) {
if (A > 0) {
outData = `正${outData}`;
} else {
outData = `负${outData}`;
}
} else {
if (A > 0) {
outData = `+${outData}`;
} else {
outData = `${outData}`;
}
}
}
// if (format.search(/^\+0/) !== -1) { // 单位有 千、百万、十亿
// if (format.search(/z$/) !== -1) {
// outData = `正${outData}`;
// } else {
// outData = `+${outData}`;
// }
// } else if (format.search(/^-0/) !== -1) { // 中式格式化,单位有 万、亿、兆
// if (format.search(/z$/) !== -1) {
// outData = `负${outData}`;
// } else {
// outData = `-${outData}`;
// }
// }
// 没匹配到
if (!onoff) {
console.log(`暂时没有${format ? format : '该'}模式;如需添加请联系:yzflhez@126.com`);
return parseFloat(outData);
}
return outData;
} catch (err) {
console.log('代码出错请联系:yzflhez@126.com')
}
};
// const aa = NFormat(122121.221, '0'); // 取整,不要小数
// const aa = NFormat('122121.221', '0');
// 常用 NFormat('122121.221', '0,0') 整数使用3位英文逗号分隔 => 122,121
// 常用 NFormat('122121.221', '0,0.00') => 122,121.22
// 常用 NFormat('122121.221', '0.00z') => "一十二万二千一百二十一点二二"
// 常用 NFormat('122121.221', '0.00k') => 122.12千
// 常用 NFormat('122121.221', '0.00w') => 12.21万
// 常用 NFormat('122121.221', '0.00m') => 0.12百万
// 常用 NFormat('122121.221', '0.00b') => 0.00十亿
// 常用 NFormat('+122121.221', '0.00%') => "+12212122.10%"
// 常用 NFormat('122121.221', '0,0.00%') => "12,212,122.10%"
module.exports = {
NFormat,
};