vue输入框数字金额限制

84 阅读1分钟

/**

    1. 只能包含 '0123456789.-',其他字符不允许输入;
    1. -只能在第一位,最多只能出现一次;
    1. .不允许出现在第一位,最多只能出现一次;
    1. -后面不能是.
    1. 第一位0之后只能是.
    1. 前两位-0后只能是.
    1. 最多两位小数,超过两位不允许继续输入
    1. 最值 ±999999 */

const filterInvalidCharts = (v: string): string => { const valid = '0123456789.-'; const charts = v.split(''); return charts.filter((item) => valid.includes(item)).join(''); };

const sliceMinus = (v: string): string => { const minus = '-'; // 没有负号 if (!v.includes(minus)) { return v; }

const index = v.indexOf(minus); // 第一位不是负号 if (index > 0) { return v.slice(0, index); }

// 截取到第二个负号之前 const [, snd] = v.split(minus); return minus + snd; };

const slicePoint = (v: string, p = 2): string => { const point = '.'; // 没有小数点 if (!v.includes(point)) { return v; }

const index = v.indexOf(point); let str = v.slice(); // 第一位是小数点 截掉第一位 if (index === 0) { str = str.slice(1); }

if (!str.includes(point)) { return str; }

// 截取到第二个小数点之前 最多两位小数 const [fst, snd] = str.split(point); return fst + point + snd?.slice(0, p) ?? ''; };

const maxLimit = (max: number, v: string): string => { let str = v.slice(); let num = parseFloat(str); while (num > max) { str = str.slice(0, -1); num = parseFloat(str); } return str; };

const minLimit = (min: number, v: string): string => { let str = v.slice(); let num = parseFloat(str); while (num < min) { str = str.slice(0, -1); num = parseFloat(str); } return str; };

const limit = (v: string, min = -999999, max = 999999): string => { const minStr = minLimit(min, v); const maxStr = maxLimit(max, minStr); return maxStr; };

export const numberInputFormat = (v: string): string => { let str = filterInvalidCharts(v); str = sliceMinus(str); str = slicePoint(str);

if (str === '' || str === '-') { return str; }

if (str.startsWith('-.')) { return str.slice(0, 1); }

if (str.startsWith('0') && str[1] !== '.') { return str.slice(0, 1); }

if (str.startsWith('-0') && str[2] !== '.') { return str.slice(0, 2); }

if (!isNumber(str)) { return ''; }

str = limit(str); return str; };

export const inputValid = (v: string): boolean => { if (v === '' || v === '-') { return false; } return true; };

export const numberInputParse = (v: string): number | null => { if (!inputValid(v)) { return null; } const num = parseFloat(v); return num; };