鍍金池/ 問答/HTML/ 怎么用匹配正則,完成只可以輸入數(shù)字或者負(fù)數(shù),但是不管正數(shù)還是負(fù)數(shù)只保留一位小數(shù)點(diǎn)

怎么用匹配正則,完成只可以輸入數(shù)字或者負(fù)數(shù),但是不管正數(shù)還是負(fù)數(shù)只保留一位小數(shù)點(diǎn)

clipboard.png
求大神指教啊
input、number屬性怎么只保留以為小數(shù)點(diǎn)的話,負(fù)號(-)怎么輸入不了啊

回答
編輯回答
神經(jīng)質(zhì)
/**
 *
 * @param {String} input - 必填。要輸入的文字
 * @param {Integer} precision - 選填。保留小數(shù)點(diǎn)后的精度,默認(rèn)為1。必須是正整數(shù)
 * @param {String} type - 選填。要返回的結(jié)果的數(shù)據(jù)類型,默認(rèn)為number。如果想要string類型只要傳入第三參數(shù)且不為undefined或者"number"即可
 * @returns {Number|String} 返回的結(jié)果是什么類型取決于傳入的type的值
 */
function demo(input, precision = 1, type = "number") {
    if (typeof input !== "string") {
        try {
            //搶救一下,能轉(zhuǎn)成字符串的就給你轉(zhuǎn)了
            input = input.toString();
        } catch (error) {
            throw new Error("朋友請傳入字符串");
        }
        console.warn("發(fā)現(xiàn)第一參數(shù)不是字符串,已經(jīng)強(qiáng)制轉(zhuǎn)成string,如果這不是你要的結(jié)果就自己調(diào)整好了再調(diào)用")
    }
    //檢查有沒有傳入不符規(guī)則的precision
    if (!Number.isInteger(precision) || precision < 0) {
        throw new Error("精度必須是正整數(shù)");
    }
    //放一個(gè)標(biāo)記,決定有沒有通過正則
    let isMatch = false;
    //核心:正則,{0,1}也可以寫成?
    const reg = /^-{0,1}\d+(\.\d+){0,1}$/;
    //核心:替換。注意,即使replace方法return的是number類型的 但是replace方法返回的必然是字符串類型
    const result = input.replace(reg, (match, floatPart) => {
        //能進(jìn)來說明正則匹配到了,就把標(biāo)記設(shè)為true通過一下
        isMatch = true;
        //取得不帶符號的整數(shù)部分
        const intPart = Math.abs(parseInt(match));
        //準(zhǔn)備一個(gè)符號標(biāo)記,如果是負(fù)數(shù)則為符號否則為空字符串
        const symbol = match.startsWith("-") ? "-" : "";
        //如果匹配到小數(shù)部分則轉(zhuǎn)成指定進(jìn)度的小數(shù)否則為0
        floatPart = floatPart ? parseFloat(parseFloat(floatPart).toFixed(precision)) : 0;
        //整數(shù)和小數(shù)部分相加 然后加上符號
        return symbol + (intPart + floatPart);
    });
    //不匹配正則,抬走
    if (!isMatch) {
        throw new Error("請傳入合法值");
    }
    //如上面注釋提到的。result必為字符串,所以要根據(jù)入?yún)ype類型決定要不要處理一下類型再給調(diào)用者
    return type === "number" ? parseFloat(result) : result;
}

clipboard.png

2017年9月19日 13:05
編輯回答
尋仙
let reg = /^-?\d+(\.\d)?$/
2018年4月11日 07:10