剑指 offer 字符串算法题:千分位分隔数字

文章介绍了两种方法对浮点数进行千分位分隔,一种是通过字符串截取和拼接,另一种是利用正则表达式的前瞻断言功能。提供了两个函数splitNum和splitNumString,分别处理数字和数字字符串,确保有效性和正确分隔。
摘要由CSDN通过智能技术生成

题目:给定一个浮点数,使用指定分隔符对其进行千分位分隔。

分析

        字符串截取拼接法,首先考虑数字的有效性,其次是将数字转化为字符串,获取使用变量存储符号,以及使用结果变量存储小数部分,更新字符串为无符号的整数部分。每三位循环截取添加分隔符,循环退出后将三个部分(符号、剩余不大于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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值