数字字符串格式化

100 阅读1分钟

1. 问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。

console.log(solution("1294512.12412") === '1,294,512.12412')
console.log(solution("0000123456789.99") === '123,456,789.99')
console.log(solution("987654321") === '987,654,321')

2. 解题方法一

function solution(s) {
  return Number(s).toLocaleString(undefined, {
    maximumFractionDigits: 10
  })
}

解题思路

先使用 Number 将字符串转为数字类型, 然后使用 number 的方法 toLocaleString 将数字转为带千分位的字符串。注意的是需要给 toLocaleString 的参数 maximumFractionDigits 设置一个比较大一点的数字,如果不填写会默认去小数点后3位数字。

3. 解题方法二

function solution(s) {
  // 去除所有前导零
  s = s.replace(/^0+/, '')
  // 先将字符串分割成整数部分和小数部分
  let parts = s.split('.');
  // 对整数部分进行处理,使用正则表达式匹配每三位数字并插入逗号
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  // 将处理过的整数部分和未改变的小数部分重新组合起来
  return parts.join('.');
}

解题思路

先用正则去掉所有的前导0,然后将整数和小数部分分开,对整数部分使用 零宽断言 的方式插入逗号。最后将处理好的整数部分和小数部分拼接。

方法二的兼容性好,不用单独判断小数点后面的位数。