JS 实现货币格式化
今天被问到货币格式化的问题
思路很清晰,但是让我写的时候,问题来了,确实是知易行难
首先肯定得有 钱
,假设为 123456.78
我们需要将他格式化为 ¥123,456.78
抛开小数位不管,我们需要获取整数位的数字字符串
默认应该是以千分位加一个,
我的思路是将整数位的字符串倒着截取,每3位数一组
那么问题来了,js截取字符串的方法有那些?
slice
、substring
、substr
用得最多的大概是slice
吧?!一提起slice
,脑子里闪过的又有splice
、split
slice、substring、substr
slice
str.slice(beginIndex[, endIndex])
参数
beginIndex
从该索引(以 0 为基数)处开始提取原字符串中的字符。如果值为负数,会被当做 strLength + beginIndex 看待,这里的strLength 是字符串的长度(例如, 如果 beginIndex 是 -3 则看作是:strLength - 3)endIndex
可选。在该索引(以 0 为基数)处结束提取字符串。如果省略该参数,slice() 会一直提取到字符串末尾。如果该参数为负数,则被看作是 strLength + endIndex,这里的 strLength 就是字符串的长度(例如,如果 endIndex 是 -3,则是, strLength - 3)。
返回值
返回一个从原字符串中提取出来的新字符串
substring
str.substring(indexStart[, indexEnd])
参数
indexStart
需要截取的第一个字符的索引,该索引位置的字符作为返回的字符串的首字母。indexEnd
可选。一个 0 到字符串长度之间的整数,以该数字为索引的字符不包含在截取的字符串内。
返回值
包含给定字符串的指定部分的新字符串。
substr
str.substr(start[, length])
参数
start
开始提取字符的位置。如果为负值,则被看作 strLength + start,其中 strLength 为字符串的长度(例如,如果 start 为 -3,则被看作 strLength + (-3))。length
可选。提取的字符数。
区别
- slice,substring,substr 都是用来截取字符串或数组的,然而数组只能使用slice,这三者如果不传参数,则都返回全部内容;
- 参数为正数时,只有substring会自动调换顺序,slice在第一参数大于第二参数时会无效返回空,而substr无所谓,除非给定的第一参数超出了源数据长度才会返回空;
- 参数为负数时,只有substring会永远无效,即不要给substring使用负值!slice可认为从尾部倒数,或者直接用源数据长度加上这个负值换算为正数,然后结论依然遵循第2条所述;而substr,则只适用第一参数为负数,换算方法同slice,其第二参数代表截取的个数,是不能为负数的;
- 据MDN所提示 (链接: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/substr) ,“ECMAscript 没有substr方法进行标准化,因此不推荐使用它”。
用slice实现
本来打算使用substr
的,既然不推荐,那么还是使用slice
吧
function formatMoney(money, symbol) {
symbol = symbol || '¥' // 默认是RMB
let str = money.toFixed(2) // 只取2位小数
let l = str.split('.')[0] // 获取整数位
let r = str.split('.')[1] // 获取小数位
let arr = [] // 用于保存结果
let len =Math.ceil(l.length / 3) // 3位数一个 `,`
for (let i = 0 ; i < len; i ++) {
arr.unshift(l.slice(-3*(i + 1), -3*i || undefined)) // 如果传(-3,0)获取不到参数,将0换成undefined相当于没传
if (i !== len - 1) { // 最后一次截取不加 `,`了
arr.unshift(',')
}
}
return symbol + arr.join('') + '.' + r
}
这是我觉得容易理解的方法之一
无个性不签名
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体