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"
),则函数可能会出错。为了支持负数,可以在开始时检查是否为负数,如果是负数,则先去掉负号,进行处理后再加回去。
优化版代码示例
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;
}
这样就能确保整数部分每三位就会插入一个逗号,而小数部分的格式保持不变,能够处理更多种类的输入。