题目:给定一个浮点数,使用指定分隔符对其进行千分位分隔。
分析:
字符串截取拼接法,首先考虑数字的有效性,其次是将数字转化为字符串,获取使用变量存储符号,以及使用结果变量存储小数部分,更新字符串为无符号的整数部分。每三位循环截取添加分隔符,循环退出后将三个部分(符号、剩余不大于3的部分、循环结果)拼接即可。
正则表达式法,使用前瞻断言?=,正则表达式为(?=\B(\\d{${every}})+$),表示在后面是"非单词边界的 every 个数字结尾出现一次或多次"匹配空字符,然后利用string.prototype.replace将匹配到的空字符替换为分隔符即可。
求解:
function splitNum(num: number, divide = '.') {
num = Number(num);
if (isNaN(num)) {
throw new TypeError('num 必须是一个有效数字');
}
let s = (num || 0).toString();
let sign = '';
// 处理负数
if (s[0] === '-') {
s = s.substring(1);
sign = '-';
}
// 处理小数点
const pointIdx = s.indexOf('.');
let res = '';
if (pointIdx !== -1) {
res = s.substring(pointIdx);
s = s.substring(0, pointIdx);
}
while (s.length > 3) {
res = divide + s.substring(s.length - 3);
s = s.substring(0, s.length - 3);
}
return sign + s + res;
}
/**
* n位分隔数字字符串(比如千分位分隔数字字符串)
* @param num 数字字符串
* @param every 每几位进行分隔
* @param divide 分隔符号
* @returns
*/
export function splitNumString(numString: string, every = 3, divide = ','): string {
// RegExp需要加反斜杠转义反斜杠
// (?=\B(\\d{${every}})+$) 前瞻断言在后面是"非单词边界的 every 个数字结尾出现一次或多次"匹配空字符
const reg = new RegExp(`(?=\\B(\\d{${every}})+$)`, 'g');
return numString.replace(reg, divide);
}