算法: 千分位格式化

2,402 阅读2分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

Hope is a good thing, maybe the best of things. And no good thing ever dies.

前言

通常我们前端拿到后端给的金额数据都是整数,此时就需要我们把它转为市面上标准的千分位显示格式,例如:将金额字符串转化为千分的顿号分隔形式 1.000.000

题目

给你一个整数 n,请你每隔三位添加点(即 "." 符号)作为千位分隔符,并将结果以字符串格式返回。

示例 1:
输入:n = 987
输出:"987"

示例 2:
输入:n = 1234
输出:"1.234"

示例 3:
输入:n = 123456789
输出:"123.456.789"

示例 4:
输入:n = 0
输出:"0"

使用正则表达式

懒人正则法,直接使用正则去匹配替换想要的格式。

function toThousands (price) {
  return (n || 0).toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1.');
}

使用字符串连接的方式

将整数转为字符串,然后去迭代字符串,每次截取长度为 3 的字符串和 . 拼接一起。

注意:只有字符串长度大于 3 的时候才去进行迭代拼接,否则直接返回即可。

/**
 * @param {number} n
 * @return {string}
 */
var thousandSeparator = function(num) {
    var num = (num || 0).toString(), result = '';
    while (num.length > 3) {
        result = '.' + num.slice(-3) + result;
        num = num.slice(0, num.length - 3);
    }
    if (num) { result = num + result; } 
    return result;
};

数组字符串拼接

将数字转换为字符串(toString())再打散成数组(split),如果直接数字转换为数组,就是一整个放进去了,不能单独取到每一位。然后通过循环,逐个倒着把数组中的元素插入到新数组的开头(unshift),第三次或三的倍数次,插入逗号,最后把新数组拼接成一个字符串

/**
 * @param {number} n
 * @return {string}
 */
var thousandSeparator = function(n) {
    var arr_n=n.toString().split("");
    var result=[];
    var cs=0;
    for(var i=arr_n.length-1;i>=0;i--){
        cs++;
        result.unshift(arr_n[i]);
    if(!(cs%3)&&i!=0){ //i!=0 即取到第1位的时候,前面不用加逗号
        result.unshift(".");
    }
  }
  return result.join("")
};

方法三的字符串版

从头到尾都用字符串完成,不通过数组,即用charAt()获取子字符串,主要用到字符串拼接

/**
 * @param {number} n
 * @return {string}
 */
var thousandSeparator = function(n) {
    var str_n=n.toString();
    var result="";
    var cs=0;
    for(var i=str_n.length-1;i>=0;i--){
        cs++;
        result=str_n.charAt(i)+result;
        if(!(cs%3)&&i!=0){
            result="."+result;
        }
    }
    return result
};

附:leetcode-cn.com/problems/th…

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏

欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后