金额输入框封装(千分位,禁止中文输入)

局部自定义指令v-money

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
使用: v-money可输入两位小数   v-money.int整数
<el-input v-money.int v-model="inputVal"></el-input>
directives: {
money: {
bind(el, binding) {
el = el.children[0];获取到el-input输入框dom
let type = binding.modifiers //自定义指令参数
function format(n) {
if (!n) return n;
if (Number(n) == 0 || n == '.') return '';//只输入0、.清空输入框
let str = n.split('.');
let re = /\d{1,3}(?=(\d{3})+$)/g;
let n1 = str[0].replace(re, "$&,");//千分位
if (type.int) return n1;//若不需要补小数点、补零
if (str.length > 1 && str[1]) {
//已输入一位小数,补一位0
str[1].length === 1 ? str[1] = str[1] + '0' : str[1]
}
return str.length > 1 && str[1] ? `${n1}.${str[1]}` : `${n1}.00`;
}
//去除千分位中的‘,’
function unformat(num) {
if (!num) return num;
num = num.toString();
num = num.replace(/,/gi, '');
let str = num.split('.');
if (type.int) return num;
//有小数为00,聚焦自动去除
if (str.length > 1) {
str[1] == '00' ? num = str[0] : num
} else {
num = num
}
return num;
}
el.addEventListener('focus', function (e) {
let inputVal = e.target.value || '';
e.target.value = unformat(inputVal)
//解决ie重新聚焦输入框,光标在最前方bug
el.setSelectionRange(e.target.value.length, e.target.value.length);
})
el.addEventListener('blur', function (e) {
e.target.value = format(e.target.value);
})
//当用户使用拼音输入法开始输入汉字时,compositionstart事件就会被触发,输入过程中不会再触发
el.addEventListener('compositionstart', function (e) {
e.target.isNeedPrevent = true;

})
//当文本段落的组成完成或取消时, compositionend 事件将被触发。
el.addEventListener('compositionend', function (e) {
e.target.isNeedPrevent = false;
})
el.addEventListener('input', function (e) {
//setTimeout+compositionstart+compositionend解决输入法为中文时,每输入拼音都会触发事件、 且会删除已经输入的正确内容的bug
setTimeout(() => {
if (e.target.isNeedPrevent) return;
let reg
if (type.int) {
reg = /[^\d]/g
} else {
reg = /[^\d.]/g
}
let str = e.target.value
str = str.replace(reg, '')
e.target.value = str
})
})
el.addEventListener('keypress', function (e) {
if (e.target.value == '' && e.key === '.') {//首位禁止输入.
e.preventDefault()
}
//注:这里的正则reg必须在本function内部声明。直接写在bind下会导致每第二次输入错误字符可 以正常输入
let reg
if (type.int) {
reg = /[^\d]/g
} else {
reg = /[^\d.]/g
}
if (reg.test(e.key)) {
e.preventDefault()
}
if (e.target.value.indexOf('.') > -1) {
let str = e.target.value.split('.')
//如果已经存在小数点,禁止再次输入
//已经存在两位小数,禁止继续输入
if (e.key === '.' || str[1].length >= 2) {
e.preventDefault()
}
}
})
}
}
}

---