vue金额类格式化之逗号分隔三位且保留两位小数

本文介绍了在Vue.js项目中如何创建一个自定义过滤器,用于将数值金额格式化为每三位加逗号分隔,并保留两位小数。通过在utils目录下创建defined.js文件并引入到Vue组件中,实现了这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于近期负责支付系统方面,所以涉及的数值金额方面的会很多,需要格式化的也就多了,找了一大圈,效果不佳,功夫不负有心人还是解决了,下面记录一下实现方法和代码,希望对你有帮助。

需求:把涉及数值金额用逗号分隔三位,且需要保留两位小数

处理方法:

1,在vue项目utils目录中,新建一个defined.js文件作为模块导出,
2,在vue引入,使用过滤器
// 引入格式化函数
import { cutMoneyFiter } from '@/utils/defined';


// 使用过滤器方法,
 filters: {
      cutMoneyFiter
},

// 模板使用:格式化方法处理
<span class="amount">{{ forn.accout  | cutMoneyFiter }}</span>
3,实现defined.js代码如下:
export const cutMoneyFiter = (amount) => {
	if(!amount) {
		return "-"
	}
	//强制保留两位小数
	let f = parseFloat(amount);
	if (isNaN(f)) return false;
		f = Math.round(amount * 100) / 100;
	let s = f.toString();
	let rs = s.indexOf('.');
	if (rs < 0) {
		rs = s.length;
		s += '.';
	}
	while (s.length < (rs + 1) + 2) {
		s += '0';
	}
	//每三位用一个逗号隔开
	let leftNum=s.split(".")[0];
	let rightNum="."+s.split(".")[1];
	let result;
	//定义数组记录截取后的价格
	let resultArray=new Array();
	if(leftNum.length>3){
		let i=true;
		while (i){
			resultArray.push(leftNum.slice(-3));
			leftNum=leftNum.slice(0,leftNum.length-3);
			if(leftNum.length<4){
				i=false;
			}
		}
		//由于从后向前截取,所以从最后一个开始遍历并存到一个新的数组,顺序调换
		let sortArray=new Array();
		for(let i=resultArray.length-1;i>=0;i--){
			sortArray.push(resultArray[i]);
		}
		result=leftNum+","+sortArray.join(",")+rightNum;
	}else {
		result=s;
	}
	return result;
}

记录:格式化功能类似(与上文无关)

作用:格式化之截取指定位数处理方法
代码如下:

/**
 * 对源数据截取decimals位小数,不进行四舍五入
 * @param {*} num 源数据
 * @param {*} decimals 保留的小数位数
 */
 export const cutOutNum = (num, decimals = 2) => {
	if (isNaN(num) || (!num && num !== 0)) {
	  return '-'
	}
   
	function toNonExponential (_num) {
	  var m = Number(_num).toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/)
	  return Number(_num).toFixed(Math.max(0, (m[1] || '').length - m[2]))
	}
   
	// 为了兼容科学计数法的数字
	num = toNonExponential(num)
	// 获取小数点的位置 + 1(不存在小数点的indexOf值为-1)
	const pointIndex = String(num).indexOf('.') + 1
	// 获取小数点后的个数(需要保证有小数位)
	const pointCount = pointIndex ? String(num).length - pointIndex : 0
   
	// 补零函数
	function zeroFill (zeroNum, num) {
	  for (let index = 0; index < zeroNum; index++) {
		num = `${num}0`
	  }
	  return num
	}
   
	// 源数据为"整数"或者小数点后面小于decimals位的作补零处理
	if (pointIndex === 0 || pointCount <= decimals) {
	  let tempNumA = num
	  // 区分"整数"和"小数"的补零
	  if (pointIndex === 0) {
		tempNumA = `${tempNumA}.`
		tempNumA = zeroFill(decimals - pointCount, tempNumA)
	  } else {
		tempNumA = zeroFill(decimals - pointCount, tempNumA)
	  }
	  return String(tempNumA)
	}
   
	// 截取当前数据到小数点后decimals位
	const Int = String(num).split('.')[0]
	const Decimal = String(num).split('.')[1].substring(0, decimals)
	const tempNumB = `${Int}.${Decimal}`
   
	// 需求:数据为0时,需要显示为0,而不是0.00...
	return Number(tempNumB) === 0 ? 0 : tempNumB
  }

更多内容待续,,

### Vue 中实现小数的千分位格式化Vue.js 中可以通过多种方式来实现金额小数部分保留两位并进行千分位格式化。以下是几种常见的解决方案: #### 方法一:使用正则表达式手动处理 通过字符串操作和正则表达式,可以轻松实现整数部分的千分位分割以及小数部分的截取。 ```javascript function formatCurrency(value) { if (value === null || value === undefined || isNaN(value)) return ''; let num = parseFloat(value).toFixed(2); // 保留两位小数[^1] let parts = num.toString().split('.'); let intPart = parts[0]; let decimalPart = parts.length > 1 ? '.' + parts[1] : ''; // 对整数部分应用千分位分隔符 intPart = intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ','); return `${intPart}${decimalPart}`; } ``` 此函数会先将数值转换为固定两位小数的形式,随后利用正则表达式对整数部分添加千分位分隔符[^2]。 --- #### 方法二:使用 `toLocaleString` API JavaScript 提供了一个内置的方法 `toLocaleString()` 来完成货币格式化的功能。该方法支持国际化设置,并能自动处理千分位分隔符和小数点位置。 ```javascript function formatCurrency(value) { if (value === null || value === undefined || isNaN(value)) return ''; return new Number(value).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } ``` 上述代码中,`minimumFractionDigits` 和 `maximumFractionDigits` 参数用于指定最小和最大显示的小数位数。这种方法不仅简单易用,还具有良好的跨浏览器兼容性[^3]。 --- #### 方法三:结合 Ant Design 组件库 如果项目已经引入了 Ant Design,则可以直接使用其 `<InputNumber>` 或其他组件的相关属性来进行格式化。 ```vue <template> <a-input-number v-model="amount" :formatter="value => value && value.replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')" :parser="value => value && value.replace(/,/gi, '')" style="width: 100%" /> </template> <script> export default { data() { return { amount: '' }; } }; </script> ``` 在此示例中,`formatter` 属性负责展示时的格式化逻辑,而 `parser` 则用来解析用户输入的内容以便保存原始数据形式。 --- ### 总结 以上三种方案各有优劣: - **正则表达式**适合轻量级场景,无需依赖额外库; - **`toLocaleString`** 更加简洁高效,尤其适用于多语言环境下的开发需求; - 如果正在使用 Ant Design UI 库的话,推荐采用官方提供的控件特性以减少自定义编码工作量。 无论选用哪种方式,请务必考虑边界条件测试(如负数、非数字字符等),从而提升程序健壮性和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值