zoukankan      html  css  js  c++  java
  • 记一次小程序的数字三分

    项目中需要将整数部分超过三位的数字中间使用逗号隔开,效果如下:

    12345678.111
            |
    123,456,78.111

    本来这种需求,直接使用Number.prototype.toLocalString()方法就可以直接达到该效果,但是在开发者工具和真机调试上都是没有问题,只要小程序发布到线上时这个方法就不管作用了。说明小程序是不支持这个JS方法的。这里就花了半天时间写了一个将数字添加逗号的方法。在此记录一下。

    1.功能需求

    1. 小数部分:多位小数(大于三位)只保留三位小数。截取方法:四舍五入
    2. 整数部分:大于三位的每隔三位添加逗号

    2.思路

    • 小数部分不能用toFixed()方法直接处理,因为小数部分不足3位,使用该方法会在小数后面填充0,比如:
      • let n = 123.1
        n.toFixed(3)   // 123.100
      • 又因为这个项目其他地方也需要用到截取小数点三位的功能,且效果一样,所以将处理小数部分单独提取成一个方法
    • 整数部分也单独提取成一个方法

    3.代码

    • 小数部分截取:
      • /**
         * @param {String | Number} num
         * @return {String}
         * @description :将数字转为三位小数点的方法,没有小数位返回原数字
         */
        function numtoFix(num) {
            let strNum = '' + num
            if (strNum.indexOf('.') >= 0) {
                let decimals = strNum.split('.')[1]
                let integer = strNum.split('.')[0]
                if (decimals.length > 3) {
                    return integer + `.${parseFloat('0.' + decimals).toFixed(3)*1000}`
                } else {
                    return '' + num
                }
            } else {
                return '' + num
            }
        }
      • 说明:
        • 小数部分小于等于3位,返回原数字
        • 小数部分大于三位,使用toFixed()方法四舍五入处理
        • 返回值为String格式
    • 整数部分:
      • /**
         * @param {String} n
         * @return {String}
         * @description :将上面转为三位浮点的方法返回的String类型的数字转为三分格式的数字
         * */
        function get3Num(n) {
            if (!n) return 0
            let fixedNum = numtoFix(n)
            // 传进来的是String格式的
            let integer = fixedNum.split('.')[0] // 整数
            let decimals = fixedNum.split('.')[1] // 小数
        
            // 将整数部分三分
            // 先将整数部分倒序组成一个新字符
            let reIntrger = integer.split('').reverse().join('')
            // 每三个隔开
            let arr_3 = reIntrger.split('')
            let arr_3_sp = arr_3.map((e, i, a) => {
                // 如果是3的倍数,将当前的元素加上“,”,后面拆分
                if ((i + 1) % 3 === 0) {
                    a[i] = a[i] + ','
                }
                return a[i]
            })
            let newInteger = arr_3_sp.map((e, i, a) => {
                a[i] = a[i].split('')
                return a[i]
            }).flat().reverse()   /* 这里flat方法也不确定能否在小程序环境使用*/
            if (newInteger[0] === ',') {
                // 当位数是3的倍数时,删除第一个逗号
                newInteger.shift()
            }
            newInteger = newInteger.join('')
            // 将整数部分与小数部分拼接起来
            let finalNum = ''
            if (decimals) {
                finalNum = `${newInteger}.${decimals}`
            } else {
                finalNum = newInteger
            }
        
            return finalNum 
        }
      • 说明:
        • 基本思路:
          • 将传入的String格式的数字打散成数组,执行翻转添加元素的操作

    4.思考:

      这种添加逗号的方法,印象中使用正则匹配应该也是可以的,所以这个方法应该还有使用正则方法达到该目的的途径。所以有待完善

  • 相关阅读:
    HDU 3848 CC On The Tree 树形DP
    编程求取直线一般式表达式,两直线交点
    向外国学者所要论文源代码--英语模版
    找出该树中第二小的值--思路及算法实现
    不使用额外空间交换2个数据的源代码
    华为2018软件岗笔试题解题思路和源代码分享
    华为笔试题--LISP括号匹配 解析及源码实现
    Linux 快捷键汇总(偏基础)
    快速排序算法思路分析和C++源代码(递归和非递归)
    Python读取SQLite文件数据
  • 原文地址:https://www.cnblogs.com/codexlx/p/14414651.html
Copyright © 2011-2022 走看看