UNPKG

yzf-number-format

Version:

数字格式化

216 lines (208 loc) 7.58 kB
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, };