百分比及保留小数指令
let eventInputChange = (ev, el, vnode) => {
let { row, prop } = el.value;
let { value } = ev.querySelector("input");
let reg = /[^\.\d\-]/gi;
if (/^\-/i.test(value) && value.length > 1) {
value = "-" + value.substr(1, value.length).replace(/\-/, "");
}
if (value > 100) {
value = "100";
}
value = value == "" ? "" : value.replace(reg, "");
row[prop] = value;
};
let eventInputBlur = (ev, el, vnode) => {
let { row, prop } = el.value;
let num = ev.getElementsByTagName("input")[0].value;
num = String(num).trim();
let arg = parseInt(el["arg"]) || null;
let number = num === "" ? "" : parseFloat(num)||0;
if (arg != null && number != "") {
number = currToFixed(number, arg);
}
row[prop] = number;
vnode.context.$forceUpdate();
};
export let number100minus = {
bind(el, binding, vnode) {
let input = el.querySelector("input");
el.addEventListener("input", eventInputChange.bind(this, el, binding, vnode), false);
input.addEventListener("blur", eventInputBlur.bind(this, el, binding, vnode), false);
}
};
function currToFixed(value, decimal) {
const n = Math.pow(10, decimal);
return divideFloat(Math.round(multiplyFloat(value, n)), n).toFixed(decimal);
}
function multiplyFloat(arg1, arg2) {
let m = 0;
const arg1Str = arg1 + "";
const arg2Str = arg2 + "";
const arg1StrFloat = arg1Str.split(".")[1];
const arg2StrFloat = arg2Str.split(".")[1];
arg1StrFloat && (m += arg1StrFloat.length);
arg2StrFloat && (m += arg2StrFloat.length);
const transferResult = +arg1Str.replace(".", "") * +arg2Str.replace(".", "");
return transferResult / Math.pow(10, m);
}
function divideFloat(arg1, arg2) {
const arg1Str = arg1 + "";
const arg2Str = arg2 + "";
const arg1StrFloat = arg1Str.split(".")[1] || "";
const arg2StrFloat = arg2Str.split(".")[1] || "";
const m = arg2StrFloat.length - arg1StrFloat.length;
const transferResult = +arg1Str.replace(".", "") / +arg2Str.replace(".", "");
return transferResult * Math.pow(10, m);
}