- 作者:老汪软件技巧
- 发表时间: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;
}
这样就能确保整数部分每三位就会插入一个逗号,而小数部分的格式保持不变,能够处理更多种类的输入。