阅读 65

前端金额格式化处理

前端项目中,金额格式化展示是很常见的需求,在此整理了一些通用的处理方式,如 toLocaleString();正则匹配;slice()循环截取等等

以此为例:12341234.246 => ¥ 12,341,234.25

方式一:采用浏览器自带的Number.prototype.toLocaleString()处理整数部分,小数部分直接用Number.prototype.toFixed()四舍五入处理

/**  * @params {Number} money 金额  * @params {Number} decimals 保留小数点后位数  * @params {String} symbol 前置符号  */ const formatMoney = (money, symbol = "", decimals = 2) => {   if (!(money && money > 0)) {     return 0.0;   }   let arr = money.toFixed(decimals).toString().split(".");   let first = parseInt(arr[0]).toLocaleString();   let result = [first, arr[1]].join(".");   return `${symbol} ${result}`; }; formatMoney(12341234.246); // 12,341,234.25 formatMoney(12341234.246, "¥", 1); // ¥ 12,341,234.2 复制代码

方式二:使用正则表达式处理整数部分,小数部分同上所示。有个《JS 正则迷你书》介绍正则表达式挺好的,在 2.4.2 章就讲了“数字的千位分隔符表示法”,介绍的很详细,推荐看看。

  • \b:单词边界,具体就是 \w 与 \W 之间的位置,也包括 \w 与 ^ 之间的位置,和 \w 与 $ 之间的位置

  • \B :\b 的反面的意思,非单词边界

  • (?=p):其中 p 是一个子模式,即 p 前面的位置,或者说,该位置后面的字符要匹配 p

/**  * @params {Number} money 金额  * @params {Number} decimals 保留小数点后位数  * @params {String} symbol 前置符号  */ const formatMoney = (money, symbol = "", decimals = 2) => {   let result = money     .toFixed(decimals)     .replace(/\B(?=(\d{3})+\b)/g, ",")     .replace(/^/, `${symbol}$ `);   return result; }; formatMoney(12341234.246, "$", 2); // $ 12,341,234.25 复制代码

方式三:循环字符串,通过 slice 截取实现

  • substring(start, end):包含 start,不包含 end

  • substr(start, length):包含 start,长度为 length

  • slice(start, end):可操作数组和字符串;包含 start,不包含 end

  • splice(start, length, items):只能针对数组;增删改都可以

const formatMoney = (money, symbol = "", decimals = 2) => {   let arr = money.toFixed(decimals).toString().split(".");   let num = arr[0];   let first = "";   while (num.length > 3) {     first = "," + num.slice(-3) + first;     num = num.slice(0, num.length - 3);   }   if (num) {     first = num + first;   }   return `${symbol} ${[first, arr[1]].join(".")}`; }; formatMoney(12341234.246, "$", 2); // $ 12,341,234.25


作者:时光足迹
链接:https://juejin.cn/post/7028086399601475591


文章分类
前端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐