74 lines
2.0 KiB
JavaScript
74 lines
2.0 KiB
JavaScript
import dayjs from 'dayjs';
|
||
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
||
dayjs.extend(customParseFormat); // 注册插件
|
||
|
||
/**
|
||
* 过滤输入,只允许数字和最多两位小数
|
||
* @param {string} value - 输入框当前值
|
||
* @param {boolean} isIntegerOnly - 是否只允许正整数(无小数点),开启时最小值为1,或为传入的值
|
||
* @returns {string} 过滤后的合法值
|
||
*/
|
||
export function filterNumberInput(value, isIntegerOnly = false) {
|
||
// 第一步就过滤所有非数字和非小数点的字符(包括字母)
|
||
let filtered = value.replace(/[^\d.]/g, "");
|
||
|
||
// 整数模式处理
|
||
if (isIntegerOnly !== false) {
|
||
// 移除所有小数点
|
||
filtered = filtered.replace(/\./g, "");
|
||
|
||
// 处理前导零
|
||
filtered = filtered.replace(/^0+(\d)/, "$1") || filtered;
|
||
|
||
// 空值处理(允许临时删除)
|
||
if (filtered === "") {
|
||
return "";
|
||
}
|
||
|
||
// 最小值限制
|
||
if (filtered === isIntegerOnly || parseInt(filtered, 10) < isIntegerOnly) {
|
||
return isIntegerOnly;
|
||
}
|
||
|
||
return filtered;
|
||
}
|
||
|
||
// 小数模式处理
|
||
const parts = filtered.split(".");
|
||
if (parts.length > 1) {
|
||
filtered = parts[0] + "." + (parts[1].substring(0, 2) || "");
|
||
}
|
||
|
||
// 处理前导零
|
||
if (filtered.startsWith("0") && filtered.length > 1 && !filtered.startsWith("0.")) {
|
||
filtered = filtered.replace(/^0+(\d)/, "$1");
|
||
}
|
||
|
||
return filtered;
|
||
}
|
||
|
||
/**
|
||
* 时间格式互转:HH:mm → HH:mm:ss;HH:mm:ss → HH:mm
|
||
* @param {string} timeStr - 输入的时间字符串
|
||
* @returns {string} 转换后的时间字符串
|
||
*/
|
||
export const convertTimeFormat = (timeStr) => {
|
||
if (!timeStr) return '00:00';
|
||
|
||
// 正则判断格式
|
||
const isHms = /^\d{1,2}:\d{2}:\d{2}$/.test(timeStr); // HH:mm:ss
|
||
const isHm = /^\d{1,2}:\d{2}$/.test(timeStr); // HH:mm
|
||
|
||
if (isHm) {
|
||
// HH:mm → 解析后格式化为 HH:mm:ss
|
||
return dayjs(timeStr, 'HH:mm').format('HH:mm:ss');
|
||
}
|
||
|
||
if (isHms) {
|
||
// HH:mm:ss → 解析后格式化为 HH:mm
|
||
return dayjs(timeStr, 'HH:mm:ss').format('HH:mm');
|
||
}
|
||
|
||
// 非法格式兜底
|
||
return '00:00';
|
||
}; |