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