form表单中嵌套表格必填项校验,金额格式添加千分位,自动保留两位

405 阅读1分钟

dom

表格校验是直接写在dom里

  <el-form :model="dailyDetailtForm" :rules="dailyDetailtFormrules" ref="dailyDetailtForm" label-width="120px" class="demo-ruleForm"  @submit.native.prevent>
        <el-table :data="dailyDetailtForm.tbDDailysettlementShifthandoverList" border stripe style="width: 100%" class="addTable" :summary-method="getSummaries" show-summary  >
          <el-table-column prop="shiftHandoverNumber" label="交班单号" min-width='80' align="center" show-overflow-tooltip />
          <el-table-column prop="cashPayable" label="应缴金额" header-align="center" min-width='80' align="right" >
            <template slot-scope="scope">
              <span>{{scope.row.cashPayable|NumFormat}}</span>
            </template>
          </el-table-column>         
          <el-table-column prop="cashReceived" label="实收现金" header-align="center"  align="right">
            <template slot-scope="scope">           
              <span v-if="dailyDetailFlag">{{scope.row.cashReceived}}</span>
              <el-form-item v-else  :prop="'tbDDailysettlementShifthandoverList.'+scope.$index+'.cashReceived'" :rules='dailyDetailtFormrules.cashReceived'>
              <el-input v-model="scope.row.cashReceived" placeholder="请输入实收现金"  maxlength="12" @blur="inputMoney($event,scope.row,'cashReceived',true)"
                  @focus="onFocusMoneyTable(scope.row,'cashReceived')"/>
              </el-form-item>
            </template>
          </el-table-column>
          <el-table-column prop="shortOverflowNumberCash" label="短 溢" header-align="center"    align="right" >
            <template slot-scope="scope">
              <span>{{comdifyFn(delcommafy(scope.row.cashPayable) -  delcommafy(scope.row.cashReceived))}}</span> 
               <span v-show="false">{{delcommafy(scope.row.shortOverflowNumberCash=delcommafy(scope.row.cashPayable) - delcommafy(scope.row.cashReceived))}}</span>      
            </template>
          </el-table-column>
          <el-table-column prop="shortOverflowCaseReason" label="短溢理由" header-align="center" show-overflow-tooltip align="center" />
        </el-table>
  </el-form>
  

js

data(){
    retrun{
          dailyDetailtFormrules: {
            cashReceived: [
              { required: true, message: '请输入实收金额', trigger: 'blur' },
              { validator: validateNumberNoComdify, trigger: "blur" },
            ],
            paperCouponsReceived: [
              { required: true, message: '请输入实收纸质券', trigger: 'blur' },
              { validator: validateStockNumber, trigger: "blur" },
            ],
      }
    }
}




  methods: {
    //实时改变输入框的值计算
     inputMoney(el, row, name, bol) {
      row[name] = this.getInputValue(el, bol)
    }
    // 输入框聚焦清楚千分位
    onFocusMoneyTable(row, name) {
        row[name] = this.delcommafy(row[name], true);
    },

   // 获取输入框的值
    getInputValue(el, bol) {
        let inputVal = el.target.value || "";
        inputVal = inputVal.trim()
        return this.comdify(this.delcommafy(inputVal, bol));
    },
    
    // 金额添加千分位
    comdify(n) {
        if (!n) return n;
        let numberReg = /^(([1-9]\d{0,2}|0)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
        if (!numberReg.test(n)) {
            return n
        }
        let index = n.lastIndexOf(".");
        let num = n.indexOf("-");
        let max = 18;
        max = num == 0 ? 19 : 18;
        let str = n.split(".");
        let re = /\d{1,3}(?=(\d{3})+$)/g;
        if (index == -1 || index > max) {
            index = max;
        }
        str[0] = str[0].substring(0, index);
        if (str[1] && str[1].length == 1) {
            str[1] = str[1] + "0";
        } else if (str[1] && str[1].length > 2) {
            str[1] = str[1].substring(0, str[1].length);
        }
        // console.log("str[1]", str[1]);
        let n1 = str[0].replace(re, "$&,");

        return str.length > 1 && str[1] ? `${n1}.${str[1]}` : `${n1}.00`;
        // return n;
    },
        // 金额整数不限校验
    validateNumberNoComdify(rule, value, callback) {
        if (value !== '') {
            if (!value) return value;
            value = value.toString();
            value = value.replace(/,/gi, "");
            let numberReg = /^(([1-9]\d{0,12})|(([0]\.\d{1,2}|0|[1-9][0-9]{0,11}\.\d{1,2})))$/
            if (!numberReg.test(value)) {
                callback(new Error('整数12位,小数2位'))
            } else {
                callback()
            }
        } else {
            callback()
        }
    },
    //去除千分位中的‘,'
    delcommafy(num, bol) {
        if (!num) return num;
        num = num.toString();
        num = num.replace(/,/gi, "");
        // 如果true不包含小数点
        if (!bol) {
            let index = num.indexOf(".")
            if (index != -1) {
                num = num.substring(0, index)
            }
        }
        return num;
    }
}