字符串格式化

196 阅读3分钟

1. 分割整数和小数部分

const sArr = s.split(".");

这行代码将输入的字符串 s 按照小数点 . 分割成一个数组 sArrsArr[0] 是整数部分,sArr[1] 是小数部分。如果输入字符串没有小数点,那么 sArr[1] 会是 undefined

2. 处理整数部分

let sArr0 = String(parseInt(sArr[0]));

这行代码先使用 parseInt()sArr[0] 转换为整数,这一步可以去除输入中的多余的零(例如,000012345 会变成 12345)。然后使用 String() 将其转换回字符串,确保后续处理。

接下来,代码计算整数部分的长度 strEnd 和开始位置 strStart

let strEnd = sArr0.length;
let strStart = sArr0.length - 3;

这两个变量将用于在字符串中每隔三位进行切割。strEnd 初始化为整数部分的长度,而 strStart 则是从字符串的末尾开始,每三位划分一个段落。

3. 使用循环插入逗号

for (let i = sArr0.length; i > 0; i -= 3) {
    let testStr = sArr0.substring(strStart, strEnd);
    str0 = str0 ? testStr + "," + str0 : testStr;
    strStart -= 3;
    strEnd -= 3;
}

这个 for 循环的目的是从右到左,每隔三位插入一个逗号。首先,使用 substring() 方法提取出当前三位数字,然后将它们拼接到 str0 之前。每次插入后,更新 strStartstrEnd,向左移动三位。

循环的条件 i > 0 表示继续处理整数部分的每个三位段,直到所有的数字都被处理完。

4. 处理小数部分

let str = sArr[1] ? str0 + "." + sArr[1] : str0;

在这个步骤中,检查是否存在小数部分。如果存在,就将 str0(格式化后的整数部分)与小数部分 sArr[1] 连接在一起,中间加上一个小数点 .。如果没有小数部分,则只返回整数部分。

5. 返回格式化后的字符串

return str;

最后,函数返回格式化后的字符串。

6. 测试用例

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');

通过这些测试用例,可以验证函数是否正确地处理了不同格式的输入。第一个用例测试了整数部分和小数部分都需要格式化的情况;第二个用例测试了前导零的情况;第三个用例则只包含整数部分。

可能的改进和优化

  1. 处理负数:当前实现没有考虑负数的情况。如果输入字符串表示负数(如 "-1234567.89"),则函数可能会出错。为了支持负数,可以在开始时检查是否为负数,如果是负数,则先去掉负号,进行处理后再加回去。

优化版代码示例

function solution(s) {
    let str0 = "";
    const sArr = s.split(".");
    let sArr0 = sArr[0];
    while (sArr0[0] == 0) {
        sArr0 = sArr0.substring(1, sArr0.length)
    }
    let strEnd = sArr0.length;
    let strStart = sArr0.length - 3;
    
    // 处理整数部分
    for (let i = sArr0.length; i > 0; i -= 3) {
        let testStr = sArr0.substring(strStart, strEnd);
        str0 = str0 ? testStr + "," + str0 : testStr;
        strStart -= 3;
        strEnd -= 3;
    }
    
    // 如果有小数部分,则格式化小数部分
    let str = sArr[1] ? str0 + "." + sArr[1] : str0;
    return str;
}

这样就能确保整数部分每三位就会插入一个逗号,而小数部分的格式保持不变,能够处理更多种类的输入。