input框替换,只让输入数字,小数点

input 只能输入正整数 和小数点,小数点限制一位。

<input  oninput="value=value.replace(/[^\d.]/g,'')
							.replace(/\.{2,}/g,'.')
							.replace(/^\./g,'')"  
							/>
  • .replace(/[^\d.]/g,‘’) 非数字型的转换为空
  • .replace(/.{2,}/g,‘.’) 连续小数点替换成一个 如:1...2 => 1.2
  • .replace(/^./g,‘’) 以. 开头的替换'' 如:.42 => 42
  • .replace(/(…*)./g, ‘$1’) 只保留第一个小数点删除后面的
  • .replace(/(…*)./g, ‘’) 小数点转换为空 如:12. => 12

main.ts
import { installDirective } from "./utils/directive";
const app = createApp(App);
installDirective(app);


directive.ts
import type { App } from "vue";
// 导入 Vue 的 App 类型,用于类型标注

export const installDirective = (app: App) => {
  // 导出一个安装函数,接收 Vue 应用实例作为参数
  app.directive("number-input", {
    // 注册一个名为 "number-input" 的自定义指令
    mounted(el) {
      // 指令挂载到元素时的生命周期钩子
      el.addEventListener("input", e => {
        // 为元素添加 input 事件监听器
        let val = e.target.value
          .replace(/[^\d.]/g, "")      // 第一步:移除非数字和非小数点字符
          .replace(/\.{2,}/g, ".")     // 第二步:将连续多个小数点替换为单个小数点
          .replace(/^\./, "")          // 第三步:移除开头的小数点
          .replace(/(\..*)\./g, "$1"); // 第四步:防止输入多个小数点(保留第一个)

        // 避免死循环:值没变化就不继续触发
        if (val !== e.target.value) {
          e.target.value = val; // 更新输入框的值
          // 手动触发 input,让 v-model 同步
          e.target.dispatchEvent(new Event("input"));
        }
      });
    },
  });
};


使用  <input  v-number-input />
以下是几种实现 input 数字类型只允许输入 2 位小数点的方法: ### 方法一:使用 JavaScript 处理输入事件 在小程序中可以使用如下代码实现,通过 `handleInput` 函数处理输入事件,对输入的值进行过滤格式化,确保只保留两位小数: ```javascript handleInput: function(e) { let price = e.detail.value; let that = this; price = price.replace(/[^\d.]/g, ""); // 清除“数字.”以外的字符 price = price.replace(/\.{2,}/g, "."); // 只保留第一个. 清除多余的 price = price.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); price = price.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); // 只能输入两个小数 if (price.indexOf(".") < 0 && price != "") { // 以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02 的金额 price = parseFloat(price); } that.setData({ price: price }); return { value: price }; } ``` 在小程序的 `input` 组件中使用该方法: ```html <input type="text" bindinput="handleInput" /> ``` 此方法适用于小程序环境,利用 `bindinput` 绑定输入事件,调用 `handleInput` 函数处理输入值,确保输入值为最多两位小数的数字 [^1]。 ### 方法二:Vue 项目中使用 JavaScript 处理输入Vue 项目中,可以在 `input` 组件上绑定 `@input` `@blur` 事件,通过 `sanitizeInput` 函数对输入进行处理: ```vue <template> <input type="text" placeholder="请输入金额 实时计算优惠" class="input_price" v-model="money" @blur="validateMoney" @input="sanitizeInput" maxlength="4" /> </template> <script> export default { data() { return { money: '' }; }, methods: { sanitizeInput(e) { // 先移除所有非数字小数点的字符 let value = e.target.value.replace(/[^0-9.]/g, ""); // 处理小数点的情况,确保只有一个小数点小数点后最多两位 const parts = value.split("."); if (parts.length > 2) { // 如果有多个小数点,取第一个小数点及之前的部分第一个小数点之后的两位 value = parts[0] + "." + parts[1].slice(0, 2); } else if (parts.length === 2) { // 如果有一个小数点,确保小数点后最多两位 value = parts[0] + "." + parts[1].slice(0, 2); } const numValue = parseFloat(value); if (!isNaN(numValue)) { if (numValue > 1000) { this.$toast("最大金额只能输入 1000"); } else if (numValue < 10) { this.$toast("最低金额不能小于 10 元"); } this.money = value; } }, validateMoney() { // 可以在这里添加失去焦点时的验证逻辑 } } }; </script> ``` 此方法在 Vue 项目中使用,通过 `@input` 事件触发 `sanitizeInput` 函数,对输入值进行处理,保证输入值为最多两位小数的数字 [^2]。 ### 方法三:普通 HTML 页面使用 JavaScript 处理输入 在普通 HTML 页面中,可以使用 `onkeyup` 事件调用 `clearNoNum` 函数对输入进行过滤格式化: ```html <!DOCTYPE html> <html> <head> <meta http-equiv="content-Type" content="text/html;charset=gb2312"> <title>js 只能输入数字小数点</title> <script language="JavaScript" type="text/javascript"> function clearNoNum(obj) { // 先把非数字的都替换掉,除了数字. obj.value = obj.value.replace(/[^\d.]/g, ""); // 必须保证第一个为数字而不是. obj.value = obj.value.replace(/^\./g, ""); // 保证只有出现一个.而没有多个 obj.value = obj.value.replace(/\.{2,}/g, "."); // 保证.只出现一次,而不能出现两次以上 obj.value = obj.value.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); // 限制为两位小数 obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); } </script> </head> <body> 只能输入数字小数点的文本: <input id="input1" onkeyup="clearNoNum(this)"> </body> </html> ``` 此方法在普通 HTML 页面中使用,通过 `onkeyup` 事件触发 `clearNoNum` 函数,对输入值进行处理,确保输入值为最多两位小数的数字 [^3]。 ### 方法四:Element UI 的 el - input 组件 如果使用 Element UI 的 `el-input` 组件,可以结合自定义验证规则实现: ```vue <template> <el-form :model="form" :rules="rules" ref="form"> <el-form-item label="奖励金额" prop="rewardAmount"> <el-input v-model="form.rewardAmount" @input="handleInput"></el-input> </el-form-item> </el-form> </template> <script> export default { data() { const validateRequire = (rule, value, callback) => { if (parseFloat(value) <= parseFloat(0)) { callback(new Error('奖励金额不能为0')); } else { callback(); } }; return { form: { rewardAmount: '' }, rules: { rewardAmount: [ { validator: validateRequire, trigger: 'blur' } ] } }; }, methods: { handleInput(e) { let value = e.target.value; value = value.replace(/[^\d.]/g, ""); value = value.replace(/^\./g, ""); value = value.replace(/\.{2,}/g, "."); value = value.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); this.form.rewardAmount = value; } } }; </script> ``` 此方法在使用 Element UI 的项目中,通过 `@input` 事件触发 `handleInput` 函数对输入值进行处理,结合自定义验证规则确保输入值为最多两位小数的数字,并且可以添加额外的验证逻辑,如值不能为 0 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值