js千分位符和数字的相互转换并保留两位小数

数字转为千分位符 

function ThousandAndDecimal(num) {
	debugger;
	if(num) {
		return parseFloat(num).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
	} else {
		return '0.00'
	}
}

千分位符转为数字

function remoney(s) {
	let str = ''
	if (s) {
		str = String(s).replace(/,/g, "")
	}
	if (s && (s + "").indexOf('.') > -1 && Number(str)) {
		return String(s).replace(/[^\d\.-]/g, "");
	} else if (s && Number(str)) {
		return str;
	} else {
		return s
	}
}

转载地址:

JS 数字千位分隔符且保留两位小数__格鲁特宝宝的博客-CSDN博客_千分符 保留2位小数

el-input框输入数字千分位保留两位小数显示,传给后端转为正常数字。_zx&it的博客-CSDN博客 

<think>好的,用户想在Vue中实现一个输入框,要求只能输入数字和最多两位小数且以千分位格式显示数值。我需要根据提供的引用资料来找到解决方案。 首先,用户提到的功能包括输入限制和格式化显示。引用[2]和[4]提到了使用正则表达式和InputNumber组件来处理输入限制和千分位格式化。引用[5]则提到失去焦点时自动转换格式,这可能涉及到事件处理。 需要确保输入只能包含数字和最多两位小数。可以使用正则表达式,比如在onkeyup事件中,用/\d+\.?\d{0,2}/来匹配数字小数点后两位的情况。同时,引用[4]中的iview InputNumber组件展示了如何用formatter和parser来处理千分位格式,这可能适用于使用UI框架的情况。 但是用户可能没有使用特定的UI框架,所以可能需要原生实现。这时候,可以结合v-model的自定义处理,在输入时过滤非法字符,在失去焦点时格式化数值为千分位补全两位小数。例如,当用户输入时,移除非数字字符,然后在失去焦点时,将值转换为带千分位两位小数的格式。 另外,要注意光标位置的问题,直接修改输入框的值可能会导致光标跳转,引用[4]中提到解决iview inputnumber的光标问题,可能需要使用formatter和parser的组合,或者在处理值时保持光标的位置。 综合来看,解决方案可能需要以下步骤: 1. 使用v-model绑定数据,监听输入事件。 2. 在输入时,使用正则表达式过滤非数字字符,限制小数点后的位数。 3. 在失去焦点时,将数值格式化为千分位补全两位小数。 4. 处理输入时的光标位置问题,避免因格式化导致的光标跳转。 可能需要结合自定义指令或者计算属性来实现这些功能。例如,在输入过程中,保持原始数值,而在显示时转换千分位格式。当用户输入时,实时校验限制输入内容,然后在失去焦点时进行格式化。 需要测试不同情况,比如用户输入多个小数点,或者输入超过两位小数的情况,确保正则表达式能够正确处理。同时,千分位格式化可以使用JavaScript的toLocaleString方法,或者自定义函数来处理,确保兼容性。 最后,可能需要参考引用中的代码示例,比如使用formatter和parser函数,或者自定义事件处理函数来实现功能。如果用户使用的是Element UI或iView,可以直接使用其InputNumber组件配置相应的属性,否则需要手动实现类似逻辑。</think>在Vue中实现输入框的数字限制与千分位格式化,可以通过以下步骤实现: ### 一、基础实现方案 ```vue <template> <el-input v-model="inputValue" @input="handleInput" @blur="formatNumber" placeholder="请输入数字" /> </template> <script> export default { data() { return { inputValue: '' } }, methods: { handleInput(value) { // 过滤非数字小数点 this.inputValue = value.replace(/[^\d.]/g, '') // 限制小数点数量 .replace(/(\..*)\./g, '$1') // 限制小数点后两位 .replace(/^(\d+\.\d{2}).*$/, '$1') }, formatNumber() { if (!this.inputValue) return // 转换数字格式化为两位小数 let num = parseFloat(this.inputValue).toFixed(2) // 添加千分位分隔符 this.inputValue = num.replace(/\B(?=(\d{3})+(?!\d))/g, ',') } } } </script> ``` ### 二、优化方案(支持动态格式化) 使用计算属性和watch实现更优雅的解决方案: ```vue <template> <el-input v-model="displayValue" @focus="handleFocus" @blur="handleBlur" /> </template> <script> export default { data() { return { rawValue: '', isFocused: false } }, computed: { displayValue: { get() { return this.isFocused ? this.rawValue : this.rawValue.replace(/\B(?=(\d{3})+(?!\d))/g, ',') }, set(value) { this.rawValue = value .replace(/[^\d.]/g, '') .replace(/(\..*)\./g, '$1') .replace(/(\.\d{2})\d+$/, '$1') } } }, methods: { handleFocus() { this.isFocused = true }, handleBlur() { this.isFocused = false this.rawValue = parseFloat(this.rawValue || 0).toFixed(2) } } } </script> ``` ### 三、使用UI框架的优化方案(以iView为例) ```vue <InputNumber v-model="value" :formatter="value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')" :parser="value => value.replace(/\$\s?|(,*)/g, '')" :precision="2" :max="999999999.99" :min="0" style="width: 200px" /> ``` 该方案直接利用UI框架的格式化能力[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值