跳至主要內容

2.数字字符串格式化

Mr.He大约 1 分钟

2.数字字符串格式化

问题描述

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


测试样例

样例 1:

输入:

s = "1294512.12412"

输出:

'1,294,512.12412'

样例 2:

输入:

s = "0000123456789.99"

输出:

'123,456,789.99'

样例 3:

输入:

s = "987654321"

输出:

'987,654,321'

解决方法

第一种实现

function solution(s: string): string {
  // PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
  // write code here
  const arr = s.split(".");
  const startArr = (Number(arr[0]) + "").split("").reverse();
  let result = [];
  for (let i = 0; i < startArr.length; i++) {
    result.push(startArr[i]);
    if (i !== startArr.length - 1 && (i + 1) % 3 === 0) result.push(",");
  }
  const start = result.reverse().join("");
  return arr[1] ? start + "." + arr[1] : start;
}

function main() {
  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");
}

main();

正则表达式优化版本

function solution(s: string): string {
  // PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
  // write code here
  const arr = s.split(".");
  const integerPart = arr[0].replace(/^0+/, ""); // 去除前导零
  const reversedIntegerPart = integerPart.split("").reverse().join("");
  const formattedIntegerPart = reversedIntegerPart
    .match(/.{1,3}/g)
    .join(",")
    .split("")
    .reverse()
    .join("");
  return arr[1] ? formattedIntegerPart + "." + arr[1] : formattedIntegerPart;
}

function main() {
  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");
}

main();

解释

  1. 去除前导零:使用 replace(/^0+/, '') 来去除前导零。
  2. 插入逗号:使用正则表达式 /.{1,3}/g 来每三位插入一个逗号。