1
/**
 *  只能输入固定位数的正负数字,可小数。
 *  @param {object} opt 配置对象
 *  @example this.$fc.numDxsCheck({
                  form: form,
                  key: 'companyName',
                  ws: 4,
                  fu: true
                }
 * */
export function numDxsCheck(opt) {
  const allOpt = {
    form: null, // 对象
    key: 'money', // 键名,不叫money时需要传入新的键名
    ws: '', // 几位小数,默认不限位数,传1代表1位小数
    type: 'Number', // 默认数字类型的字符串,不支持首位多个0;传入String,支持以下格式。00.1;0001221。一般不会有这种使用需求。
    fu: false // 是否支持-负数符号
  };
  for (let key in opt) {
    allOpt[key] = opt[key];
  }
  allOpt.form[allOpt.key] = allOpt.form[allOpt.key] + '';
  if (allOpt.type === 'Number') {
    // 首位是0,第二位必须是.
    if (allOpt.form[allOpt.key].slice(0, 1) === '0') {
      allOpt.form[allOpt.key] = allOpt.form[allOpt.key].slice(1, 2) !== '.'?'0':allOpt.form[allOpt.key];
    }
    // 首位是-0,第三位必须是.
    if (allOpt.form[allOpt.key].slice(0, 2) === '-0') {
      allOpt.form[allOpt.key] = allOpt.form[allOpt.key].slice(2, 3) !== '.'?'-0':allOpt.form[allOpt.key];
    }
  }
  // 先把非数字的都替换掉,除了数字和.
  if (allOpt.fu) {
    allOpt.form[allOpt.key] = allOpt.form[allOpt.key].replace(/[^\d.-]/g, '');
  } else {
    allOpt.form[allOpt.key] = allOpt.form[allOpt.key].replace(/[^\d.]/g, '');
  }
  // 必须保证第一个为数字而不是.
  allOpt.form[allOpt.key] = allOpt.form[allOpt.key].replace(/^\./g, '');
  // 保证只有出现一个.而没有多个.
  allOpt.form[allOpt.key] = allOpt.form[allOpt.key].replace(/\.{2,}/g, '.');
  // 保证只有出现一个-号,且在首尾
  allOpt.form[allOpt.key] = allOpt.form[allOpt.key].slice(0, 1) + allOpt.form[allOpt.key].slice(1, allOpt.form[allOpt.key].length).replace(/\-/g, '');

  // 动态正则,小数位动态处理
  const c = new RegExp('^(\\-)*(\\d+)\\.(\\d{0,' + allOpt.ws + '})\.*$');
  // 只能输入两个小数
  allOpt.form[allOpt.key] = allOpt.form[allOpt.key].replace(c, '$1$2.$3');
}

请鹅出战
328 声望3 粉丝

当我带上墨镜,也许我就真的瞎了。