vue3-简单的千分位金额转换指令

Vue3实现千分位金额转换指令

输入框输入数字后转换为千分位金额格式

使用vue3的自定义指令来完成

这里先来准备两个函数,千分位转换函数 和 解析千分位字符串函数

// 千分位转换函数
const formatNumberToThousands = (num) => {
  if (typeof num === 'undefined' || num === null || isNaN(num)) return '';
  return Number(num).toLocaleString('zh-CN', {
    minimumFractionDigits: 2,
    maximumFractionDigits: 2
  });
};
// 解析千分位字符串为数字
const parseThousandsNumber = (str) => {
  if (typeof str === 'undefind' || str === null || typeof str !== 'string') return 0;
  const cleanedStr = str.replace(/,/g, '');
  return isNaN(cleanedStr) ? 0 : Number(cleanedStr);
};

处理输入框格式,将无关的字符过滤掉

// 格式处理
function formatting(value) {
  let inputValue = value.replace(/[^\d.-]/g, ''); // 只保留数字、小数点和负号
  // 处理小数点,确保最多只有一个小数点
  const dotIndex = inputValue.indexOf('.');
  if (dotIndex !== -1) {
    inputValue = inputValue.slice(0, dotIndex + 3); // 最多保留两位小数
  }
  return inputValue
}

指令内容

export default {
  mounted(el, binding) {
    const input = el.querySelector('input') || el;
    const value = binding.value;

    // 初始化显示千分位格式
    input.value = formatNumberToThousands(value);

    // 失去焦点时处理,转换为千分位格式
    const handleBlur = (e) => {
      const target = e.target;
      target.value = formatting(target.value)
      const parsedValue = parseThousandsNumber(target.value);
      // 更新绑定的值
      binding.instance[binding.arg] = parsedValue;
      target.value = formatNumberToThousands(parsedValue);
    };

    input.addEventListener('blur', handleBlur);

    // 解绑事件监听器
    return () => {
      // input.removeEventListener('input', handleInput);
      input.removeEventListener('blur', handleBlur);
    };
  },
};
### 实现金额分割与千分位格式化前端开发中,将金额数值分为整数和小数部分,并对其进行格式化显示,是常见的需求之一。特别是在涉及财务或电商的应用中,正确的金额显示不仅提升了用户体验,也增强了数据的可读性和准确性。 为了实现这一功能,可以通过JavaScript一个函数,该函数接收一个数值作为输入,然后返回一个字符串,其中整数部分已经按照千分位进行了格式化,而小数部分则被四舍五入并保留两位小数。 ```javascript function formatAmount(value) { // 确保输入是一个有效的数字 if (isNaN(value)) return &#39;0.00&#39;; // 将输入值转换为浮点数,并四舍五入到两位小数 const roundedValue = Math.round(parseFloat(value) * 100) / 100; // 分割整数和小数部分 const [integerPart, decimalPart = &#39;00&#39;] = roundedValue.toString().split(&#39;.&#39;); // 对整数部分应用千分位分隔符 const formattedInteger = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, &#39;,&#39;); // 确保小数部分始终有两位 const paddedDecimal = decimalPart.padEnd(2, &#39;0&#39;); // 返回格式化的字符串 return `${formattedInteger}.${paddedDecimal}`; } ``` 上述函数首先检查输入是否为有效数字。如果输入无效,则默认返回`0.00`。接着,它使用`Math.round`方法将数值乘以100后取整,再除以100来达到四舍五入保留两位小数的目的。之后,通过`split(&#39;.&#39;)`方法将整数和小数部分分开。对于整数部分,利用正则表达式在每三位数字之间插入逗号实现千分位格式化。最后,确保小数部分总是包含两位,不足时用零填充[^2]。 ### 在Vue3中的应用 当在Vue3项目中使用此功能时,可以创建一个自定义指令或者过滤器(尽管Vue3 Composition API中推荐使用方法或计算属性代替过滤器),以便在模板中轻松地对金额进行格式化显示。 ```javascript // 创建Vue实例时注册自定义方法 const app = createApp(App); app.config.globalProperties.$filters = { // 定义金额格式化过滤器 formatAmount(value) { // 此处放置上面定义的formatAmount函数逻辑 // ... } }; app.mount(&#39;#app&#39;); ``` 在组件模板中,可以直接使用这个过滤器来格式化显示金额: ```html <!-- 在模板中使用过滤器 --> <span>{{ amount | formatAmount }}</span> ``` 不过,在Vue3的Composition API中,更推荐的做法是直接在组件内部定义一个方法或使用计算属性来处理这种格式化需求,这样能够更好地利用Vue的响应式系统,并保持代码的清晰和维护性[^4]。 ### 示例代码 下面是一个简单的示例,展示了如何在Vue3组件中使用`formatAmount`函数: ```javascript import { ref, computed } from &#39;vue&#39;; export default { setup() { const amount = ref(1234567.891); // 使用计算属性自动格式化金额 const formattedAmount = computed(() => { return formatAmount(amount.value); }); return { amount, formattedAmount }; } }; ``` 在这个例子中,`amount`是一个响应式的引用,当它的值发生变化时,`formattedAmount`计算属性会自动重新计算,并返回格式化后的字符串。这样就可以在模板中绑定`formattedAmount`,以显示格式化金额了[^4]。 ### 注意事项 - 当处理用户输入时,需要考虑各种边界情况,比如非数字字符的输入、多个小数点的情况等。 - 对于非常大的数值,需要注意JavaScript中浮点运算可能带来的精度损失问题。 - 如果需要支持国际化的金额格式(如不同地区的货币符号、小数点符号等),则需要额外处理这些细节,或者考虑使用现有的库如`accounting.js`等。 通过以上步骤,可以在Vue3项目中有效地实现金额的分割、千分位格式化以及四舍五入保留两位小数的功能,从而满足前端展示的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值