当前位置:首页 > VUE

vue实现输入金额

2026-03-08 13:10:53VUE

实现输入金额的Vue组件

在Vue中实现金额输入功能需要处理格式化、校验和用户交互。以下是实现方案:

金额输入基础实现

创建基本的金额输入组件,使用v-model进行双向绑定:

<template>
  <input 
    type="text" 
    v-model="displayValue"
    @input="handleInput"
    @blur="formatValue"
  />
</template>

<script>
export default {
  props: {
    value: {
      type: [Number, String],
      default: 0
    }
  },
  data() {
    return {
      displayValue: ''
    }
  },
  methods: {
    handleInput(e) {
      let value = e.target.value.replace(/[^\d.]/g, '')
      this.displayValue = value
      this.$emit('input', parseFloat(value || 0))
    },
    formatValue() {
      if (this.displayValue) {
        this.displayValue = parseFloat(this.displayValue).toFixed(2)
      }
    }
  },
  watch: {
    value: {
      immediate: true,
      handler(val) {
        this.displayValue = val ? parseFloat(val).toFixed(2) : ''
      }
    }
  }
}
</script>

金额格式化处理

实现自动格式化显示,例如千位分隔符:

methods: {
  formatCurrency(value) {
    if (!value) return '0.00'
    const parts = parseFloat(value).toFixed(2).split('.')
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',')
    return parts.join('.')
  },
  unformatCurrency(value) {
    return value.replace(/,/g, '')
  }
}

输入限制与校验

添加输入限制,防止非法字符:

handleInput(e) {
  let value = e.target.value
  // 只允许数字和单个小数点
  value = value.replace(/[^\d.]/g, '')
  // 限制小数点后两位
  if (value.indexOf('.') > -1) {
    const decimal = value.split('.')[1]
    if (decimal.length > 2) {
      value = value.substring(0, value.length - 1)
    }
  }
  // 限制只能有一个小数点
  const dots = value.match(/\./g)
  if (dots && dots.length > 1) {
    value = value.substring(0, value.length - 1)
  }
  this.displayValue = value
  this.$emit('input', parseFloat(value || 0))
}

完整组件示例

结合上述功能的完整组件:

<template>
  <div class="currency-input">
    <span v-if="prefix" class="prefix">{{ prefix }}</span>
    <input
      ref="input"
      type="text"
      :placeholder="placeholder"
      v-model="displayValue"
      @input="handleInput"
      @blur="formatValue"
      @focus="unformatValue"
    />
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: [Number, String],
      default: null
    },
    prefix: {
      type: String,
      default: ''
    },
    placeholder: {
      type: String,
      default: '0.00'
    }
  },
  data() {
    return {
      displayValue: ''
    }
  },
  methods: {
    handleInput(e) {
      let value = e.target.value
      value = value.replace(/[^\d.]/g, '')

      const dots = value.match(/\./g)
      if (dots && dots.length > 1) {
        value = value.substring(0, value.length - 1)
      }

      if (value.indexOf('.') > -1) {
        const decimal = value.split('.')[1]
        if (decimal.length > 2) {
          value = value.substring(0, value.indexOf('.') + 3)
        }
      }

      this.displayValue = value
      this.$emit('input', value ? parseFloat(value) : null)
    },
    formatValue() {
      if (this.displayValue) {
        this.displayValue = this.formatCurrency(this.displayValue)
      }
    },
    unformatValue() {
      if (this.displayValue) {
        this.displayValue = this.unformatCurrency(this.displayValue)
      }
    },
    formatCurrency(value) {
      if (!value) return ''
      const parts = parseFloat(value).toFixed(2).split('.')
      parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',')
      return parts.join('.')
    },
    unformatCurrency(value) {
      return value.replace(/,/g, '')
    }
  },
  watch: {
    value: {
      immediate: true,
      handler(val) {
        if (val === null || val === '') {
          this.displayValue = ''
        } else {
          this.displayValue = this.formatCurrency(val)
        }
      }
    }
  }
}
</script>

<style>
.currency-input {
  display: flex;
  align-items: center;
}
.prefix {
  margin-right: 5px;
}
input {
  border: 1px solid #ddd;
  padding: 8px;
  border-radius: 4px;
  width: 100%;
}
</style>

使用第三方库

对于更复杂的金额处理,可以考虑使用以下库:

  • vue-currency-input:专门为Vue设计的货币输入组件
  • accounting.js:提供强大的货币格式化功能
  • currency.js:轻量级的货币处理库

安装和使用示例:

vue实现输入金额

npm install vue-currency-input
<template>
  <currency-input v-model="amount" />
</template>

<script>
import { CurrencyInput } from 'vue-currency-input'

export default {
  components: {
    CurrencyInput
  },
  data() {
    return {
      amount: 0
    }
  }
}
</script>

这些实现方案提供了从基础到高级的金额输入功能,可以根据项目需求选择合适的实现方式。

标签: 金额vue
分享给朋友:

相关文章

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-se…

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放 A…

vue实现sso

vue实现sso

Vue 实现 SSO(单点登录)方案 单点登录(SSO)允许用户通过一次登录访问多个相关系统。以下是基于 Vue 的实现方案: 使用 OAuth2/OpenID Connect 协议 OAuth2…

vue实现分类

vue实现分类

Vue实现分类功能的方法 使用v-for和计算属性 通过计算属性对数据进行分类处理,结合v-for渲染分类后的列表。示例代码: <template> <div>…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue实现ssr

vue实现ssr

Vue 实现 SSR(服务端渲染) Vue 的服务端渲染(SSR)允许在服务器端生成完整的 HTML 内容,再发送到客户端,提升首屏加载速度和 SEO 友好性。以下是实现 Vue SSR 的关键步骤和…