antd input-number 数字输入正则校验
ant-design-vue 数字输入组件的常用校验方法
这里的格式是,只能输入数字或小数, 整数部分每三位添加一个逗号分隔符
可以把校验方法单独抽离出来放在公共的文件里,方便复用
一般有两种数字输入校验方法,
第一种是输入时,检测到输入内容不匹配,去掉不匹配的输入内容
第二种是,通过 form 表单的 rules 校验,不匹配的就提示输入内容不合格
antd 提供的 input-number 组件已经帮我们处理的不是数字输入的内容,基本只需要处理数字的展示和位数限制就可以了
如果不是用的 UI 组件或者使用的 UI 组件没有数字输入框,就需要自己校验
这里整理了两种输入组件,普通的 input 输入和 type=number 的 input 输入
要注意,type=number时,数字三位增加逗号,逗号是不能被显示的.所以需要处理,输入的时候type=number,鼠标移出展示的时候type=text
效果图:
完整代码:
<template>
<div>
<h3>原生输入框,输入数字(改变输入内容)</h3>
<div class="date-box">
<div class="item">
<h3>文本输入框,整数或小数</h3>
<a-input
:value="amount"
style="width: 70%"
@input="handleInput"
@blur="handleBlur"
></a-input>
</div>
<div class="item">
<h3>文本输入框,整数或小数,小数位数不超过两位</h3>
<a-input
:value="amount3"
style="width: 70%"
@input="handleInput3"
@blur="handleBlur3"
></a-input>
</div>
<div class="item">
<h3>type=number输入框,整数或小数</h3>
<a-input
:type="isEdit ? 'number' : 'text'"
:value="amount2"
@input="handleInput2"
@blur="handleBlur2"
@focus="handleFaucs2"
style="width: 70%"
></a-input>
</div>
</div>
<h3>数字输入组件(改变输入内容)</h3>
<p>inputnumber数字输入组件自带的会处理输入不是数字和输入多个小数点的情况</p>
<div class="date-box">
<div class="item">
<h3>数字输入,自动添加小数点</h3>
<a-input-number
:min="0"
:max="9999"
:precision="2"
style="width: 70%"
/>
</div>
<div class="item">
<h3>数字输入,每3位添加逗号分隔符,小数位数不超过2</h3>
<a-input-number
:min="0"
:max="9999999999"
:precision="2"
:formatter="numberFormat"
:parser="toNumberFormat"
style="width: 70%"
/>
</div>
<div class="item">
<h3>数字输入,每3位添加逗号分隔符,小数不处理</h3>
<a-input-number
:min="0"
:max="9999999999"
:formatter="numberDotFormat"
:parser="toNumberFormat"
style="width: 70%"
/>
</div>
</div>
<h3>数字输入组件(form表单校验提示)</h3>
<a-form
ref="formRef"
name="dynamic_form_item"
:model="info"
:rules="rules"
:label-col="{ span: 5 }"
:wrapper-col="{ span: 17 }"
>
<div class="date-box">
<div class="item">
<h3>只能输入整数(四舍五入)</h3>
<a-form-item label="数字1" name="number1">
<a-input-number
v-model:value="info.number1"
:min="0"
:max="9999"
:precision="0"
style="width: 70%"
/>
</a-form-item>
</div>
<div class="item">
<h3>只能输入整数(不改变,提示)</h3>
<a-form-item label="数字2" name="number2">
<a-input-number
v-model:value="info.number2"
:min="0"
:max="9999"
style="width: 70%"
/>
</a-form-item>
</div>
<div class="item">
<h3>只能输入整数和小数,小数位数不超过3</h3>
<a-form-item label="数字3" name="number3">
<a-input-number
v-model:value="info.number3"
:min="0"
:max="9999"
style="width: 70%"
/>
</a-form-item>
</div>
</div>
<div><a-button type="primary" @click="submit">保存</a-button></div>
</a-form>
</div>
</template>
<script>
import {
numberFormat,
toNumberFormat,
numberDotFormat,
initNumberReg,
initDotNumberReg,
numberInputFormat,
numberInputFormat2,
} from "@/utils";
import { reactive, ref } from "vue";
import { message } from "ant-design-vue";
export default {
name: "numberInput",
setup() {
const info = reactive({
number1: null,
number2: null,
number3: null,
});
const formRef = ref(null);
const rules = {
number1: [{ required: true, trigger: "blur", message: "请输入数字" }],
number2: [
{ required: true, trigger: "blur", message: "请输入数字" },
initNumberReg,
],
number3: [
{ required: true, trigger: "blur", message: "请输入数字" },
initDotNumberReg,
],
};
const submit = () => {
formRef.value.validateFields().then(() => {
console.log(info);
message.success("success");
});
};
const amount = ref(null);
const handleInput = (e) => {
const val = e.target.value;
amount.value = val;
};
const handleBlur = (e) => {
const val = e.target.value;
amount.value = numberInputFormat(val);
// console.log(amount.value);
};
const amount3 = ref(null);
const handleInput3 = (e) => {
const val = e.target.value;
amount3.value = val;
};
const handleBlur3 = (e) => {
const val = e.target.value;
amount3.value = numberInputFormat(val, 2);
// console.log(amount.value);
};
const amount2 = ref(null);
const isEdit = ref(true); // 是否是编辑状态
const handleInput2 = (e) => {
const val = e.target.value;
amount2.value = val;
};
const handleBlur2 = (e) => {
const val = e.target.value;
amount2.value = numberInputFormat2(val);
isEdit.value = false;
// console.log(amount.value);
};
const handleFaucs2 = () => {
amount2.value = toNumberFormat(amount2.value);
isEdit.value = true;
};
return {
numberFormat,
toNumberFormat,
numberDotFormat,
numberInputFormat,
numberInputFormat2,
info,
formRef,
rules,
submit,
amount,
handleInput,
handleBlur,
amount3,
handleInput3,
handleBlur3,
amount2,
isEdit,
handleInput2,
handleBlur2,
handleFaucs2,
};
},
};
</script>
<style scoped>
.date-box {
display: flex;
margin-bottom: 24px;
flex-wrap: wrap;
}
.date-box .item {
width: 45%;
margin-bottom: 12px;
}
</style>
通用的正则校验:
utils>index.js
// 常用数据转换 export const initDotReg = /\B(?=(\d{3})+(?!\d))/g; // 整数每3位添加逗号分隔符 export const floatDotReg = /(?!^)(?=(\d{3})+\.)/g; // 小数每3位添加逗号分隔符 // 数字输入,每3位添加逗号分隔符 export const numberFormat = (value) => { if (value) { return value.replace(initDotReg, ","); } else { return value; } }; // 去掉逗号 export const toNumberFormat = (value) => { if (value) { return value.replace(/\$\s?|(,*)/g, ""); } else { return value; } }; // 数字输入,每3位添加逗号分隔符,小数不处理 export const numberDotFormat = (value) => { if (value) { // 有小数点 if (String(value).indexOf(".") > 0) { return value.replace(floatDotReg, ","); } else { // 无小数点 return value.replace(initDotReg, ","); } } else { return value; } }; // 正则校验 // 只能输入整数 export const initNumberReg = { pattern: /^[1-9]+\d*$/, trigger: "blur", message: "只能输入整数", }; // 只能输入整数或小数 export const initDotNumberReg = { pattern: /^(0|[1-9])+(\.[0-9]{1,3}){0,1}$/, trigger: "blur", message: "只能输入整数或小数,小数位数不超过3", }; // 文本输入框, 数字输入,每3位添加逗号分隔符,只能输入一个小数点 // val:输入内容 dot:小数位数 export const numberInputFormat = (val, dot = 0) => { if (val) { const numberReg = /[^\d^\.]+/g; // 只保留数字和. const dotreg = /(\.+)*(\d{0,})\.(\.+)*(\d{0,}).*$/; // 只保留一个点. let value = val.replace(numberReg, "").replace(dotreg, "$2.$4"); // console.log(value); value = Number(value); if (isNaN(value)) return ""; value = String(value); // 有小数点 if (String(value).indexOf(".") > 0) { // console.log(value); if (dot) { const precisionReg = new RegExp("(\\d+)\\.(\\d{" + dot + "})(\\d+)*$"); // 输入小数个数限制 // const precisionReg = /^(\d+)\.(\d{2})(\d+)*$/; // 输入小数个数限制 value = value.replace(precisionReg, "$1.$2"); } return value.replace(floatDotReg, ","); } else { // 无小数点 return value.replace(initDotReg, ","); } } else { return val; } }; // type=number输入框, 数字输入,每3位添加逗号分隔符,只能输入一个小数点 export const numberInputFormat2 = (val) => { if (val) { let value = Number(val); value = String(value); // 有小数点 if (String(value).indexOf(".") > 0) { return value.replace(floatDotReg, ","); } else { // 无小数点 return value.replace(initDotReg, ","); } } else { return val; } };

浙公网安备 33010602011771号