如何将页面上的数字显示为千分符且保留两位小数?toLocaleString()和toFixed(2)混用无效

在这里插入图片描述

近日突然发现页面数值列显示改为千分符格式的方法toLocaleString()前后端用起来都有坑,特此记录一下细节。

前端javascript实现

  1. 问题复现
// 单独用toFixed(2)和toLocaleString() 正常
let price = 1234
price.toFixed(2) //1234.00
Number(totalValue).toLocaleString() //1,234

price = 1234.12
price.toFixed(2)// 1234.12
Number(price).toLocaleString() //1,234.12

// 合并使用不行
parseFloat(price).toFixed(2).toLocaleString() //1234.12
parseFloat((11234).toFixed(2)).toLocaleString() //1,234
  1. 解释:
    一旦你使用toFixed,price是一个字符串,而不是一个数字,所以toLocaleString不会改变它。
  2. 正确的用法,用toLocaleString()自带的options参数设置代替toFixed():
let price = 1234.12
price.toLocaleString('en-US', { 
minimumFractionDigits: 2, 
maximumFractionDigits: 2 
})   //1,234.12

最后我抽取了一个公共方法:

var numberToPrice = function(number) { 
if (typeof number !== 'number') {
 return 'NaN'; 
} 
//这里Math.floor是保留两位时防止产生四舍五入,toFixed()默认会进行四舍五入
let price = Math.floor(100 * number) / 100;  
let newPrice = price.toLocaleString('en-US', {  //'en-US'参数指定区域,此参数可以直接用undefined
minimumFractionDigits: 2,
 maximumFractionDigits: 2 
}) 
return newPrice; 
} 
console.log(numberToPrice(13422.126))  // 13422.12

后端Java实现

机智的我也想到了从后端格式化数据的方法,那大前端就省事多了,也得注意这个点:
Java种的toLocaleString()方法已经过时,我的后端用不了(也可能缺少某个jar懒得加了)
用DecimalFormat来格式化,我的页面数据既有整数也有小数没有统一格式,为了不影响原先的展示效果只增加了千分符,公共方法如下:

	// 千分符 格式化
    public static String parseNumberQff(String pattern, String number) throws Exception {
        BigDecimal data = new BigDecimal(number);
        if (StringUtils.isNotEmpty(pattern)){
            DecimalFormat df = new DecimalFormat(pattern);
            return df.format(data);
        }
        if (StringUtils.isNotEmpty(number) && number.indexOf(".") > 0){
            pattern = ",###,###.00";
        } else {
            pattern = ",###,###";
        }
        DecimalFormat df = new DecimalFormat(pattern);
        return df.format(data);
    }

测试OK

在这里插入图片描述

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要冗余

感谢您的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值