• 作者:老汪软件技巧
  • 发表时间:2024-12-12 10:04
  • 浏览量:

1. 分割整数和小数部分

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

这行代码将输入的字符串 s 按照小数点 . 分割成一个数组 sArr。sArr[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 之前。每次插入后,更新 strStart 和 strEnd,向左移动三位。

循环的条件 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');

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

可能的改进和优化处理负数:当前实现没有考虑负数的情况。如果输入字符串表示负数(如 "-1234567.89"),则函数可能会出错。为了支持负数,可以在开始时检查是否为负数,如果是负数,则先去掉负号,进行处理后再加回去。考虑 parseInt() 的边界情况:parseInt() 在处理包含非数字字符的字符串时可能会有意外行为(例如 "123abc" 会被解析为 123)。因此,如果字符串中包含非数字字符,应考虑使用更为精确的处理方式。提高效率:目前的实现每次都使用 substring() 和字符串拼接进行操作,随着字符串长度的增加,效率可能会下降。可以通过使用数组和 join() 方法来优化性能。优化版代码示例

function solution(s) {
    let str0 = "";
    const sArr = s.split(".");
    let sArr0 = String(parseInt(sArr[0], 10)); // 处理整数部分,避免前导零
    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;
}

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