数字字符串格式化

问题描述

小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'

需求分析:

1.去除头部无用的0

2.整数部分处理为千分位逗号的格式化

3.保留小数部分

首先拆分整数和小数部分,整数部分,先取出头部的0(通过正则实现),再写一个函数去实现千分位逗号格式化(实现的逻辑可以通过一个循环,从尾部每三位取出,再拼接)。最终拼接整数和小数部分。

代码实现:

// 处理整数头部多余的0
function parseIntHead(s:string) {
    return (s||"").replace(/^0+/,"");
}

// 处理整数部分
function splitChunk(s:string,count:number) {
    let str = parseIntHead(s);
    let list:string[] = [];
    while(str.length>count) {
        const index = str.length - 3
        const  rest  = str.slice(0,index)
        const  sliced = str.slice(index)
        list.unshift(sliced);
        str = rest
    }
    const head = str;
    if (head.length) {
        list.unshift(head);
    }
    return list.join(",")
}

function solution(s: string): string {
    // write code here
    const [iniNum,floatNum] = s.split(".")
    const formattedIntNum = splitChunk(iniNum,3);
    return [formattedIntNum,floatNum].filter(Boolean).join(".");
}

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