数字处理系列

(1)将数字转化成中文的过滤器

html 复制代码
<template>
    <div>
      <p>数字转中文:{{ 110 | numberToChinese }}</p>
    </div>
  </template>
  
  <script>
  export default {
    filters: {
        numberToChinese(num) {
            const chineseNums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
            const units = ['', '十', '百', '千', '万', '十万', '百万', '千万', '亿'];

            // 将数字转为字符串并分离每个数字
            let str = String(num);
            let len = str.length;
            
            // 结果字符串
            let result = '';
            
            // 遍历每一个数字,根据其位置决定是否添加单位(十、百、千等)
            for (let i = 0; i < len; i++) {
                let n = +str[i]; // 获取数字
                let unit = units[len - i - 1]; // 获取当前数字的单位
                
                // 当遇到"0"时,不添加单位,但处理连续零时只保留一个零
                if (n === 0) {
                // 如果结果已有数字,且最后一位不是零,才添加零
                if (result[result.length - 1] !== chineseNums[0]) {
                    result += chineseNums[0];
                }
                } else {
                result += chineseNums[n] + unit;
                }
            }

            // 处理 "一十" 的特殊情况,中文中 "一十" 应写作 "十"
            result = result.replace(/^一十/, '十');

            // 处理结果最后的"零"(如果是零结尾的数字,比如 1000,应去掉多余的零)
            result = result.replace(/零+$/, '');

            return result;
        }
    }
  };
  </script>
  

(2)正整数

el-table中的el-input限制只能输入正整数

html 复制代码
<template>
  <el-table :data="tableData" style="width: 100%">
    <el-table-column prop="date" label="日期" width="180"> </el-table-column>
    <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
    <el-table-column label="成绩">
      <template slot-scope="scope">
        <el-input
          v-model="scope.row.score"
          @input="scope.row.score = limitToPositiveInteger(scope.row.score)"
          size="small"
        ></el-input>
      </template>
    </el-table-column>
  </el-table>
</template>
 
<script>
export default {
  data() {
    return {
      tableData: [
        { date: '2016-05-02', name: '张三', score: '' },
        { date: '2016-05-04', name: '李四', score: '' },
        // ...
      ],
    };
  },
  methods: {
  //把.replace(/^0+/, '')干掉首位就可以输入0
    limitToPositiveInteger(value) {
      // 限制只能输入正整数
      return value.replace(/[^\d]/g, '').replace(/^0+/, '');
    },
  },
};
</script>

(3)金额场景

el-input限制组件只能输入数字,且整数部分有两位或两位以上时第一位不能为 0,并且小数部分最多只能输入两位小数。(适用于输入金额场景)

html 复制代码
<template>
    <div>
      <el-input
        v-model="inputValue"
        @input="inputValue = handleInput(inputValue)"
        placeholder="请输入数字"
      ></el-input>
      <el-button @click="test">打印</el-button>
    </div>
  </template>
  
  <script>
  export default {
    data() {
      return {
        inputValue: ''
      };
    },
    methods: {
      test(){
        console.log(this.inputValue)
      },
      handleInput(value) {
        // 允许输入整数或小数,且第一位不能为0,小数点后最多两位
        const regex = /^(?!0\d)\d*(\.\d{0,2})?$/;
        if (regex.test(value)) {
           return value;
        } else {
          // 如果不符合规则,尝试修复输入
          return value.replace(/[^0-9.]/g, '') // 移除非数字和小数点
                                           .replace(/(\..*)\./g, '$1') // 禁止多于一个小数点
                                           .replace(/^0+(\d)/, '$1') // 禁止整数部分多余的0
                                           .replace(/^(\d+)\.(\d{2}).*$/, '$1.$2'); // 限制小数点后两位
        }
      }
    }
  };
  </script>
  

(4)百分比

el-input 组件只能输入整数和小数,小数部分最多两位,且整数部分只能输入 0 到 100,并且当整数部分正好是 100 时不能输入小数(适用于百分比)

html 复制代码
<template>
    <div>
      <el-input
        v-model="inputValue"
        @input="inputValue = handleInput(inputValue)"
        placeholder="请输入0到100之间的数字,小数最多两位"
      ></el-input>
    </div>
  </template>
  
  <script>
  export default {
    data() {
      return {
        inputValue: ''
      };
    },
    methods: {
      handleInput(value) {
        // 检查输入值是否符合条件
        const regex = /^(100|[1-9]?\d)(\.\d{0,2})?$/;
  
        // 如果整数部分是100,不允许输入小数
        if (/^100(\.\d*)?$/.test(value)) {
          return '100';
        } 
        // 如果输入符合条件,更新 inputValue
        else if (regex.test(value)) {
            return value;
        } 
        // 不符合条件时,修正输入值
        else {
            return value.replace(/[^0-9.]/g, '') // 移除非数字和小数点
                                           .replace(/(\..*)\./g, '$1') // 禁止多于一个小数点
                                           .replace(/^0+(\d)/, '$1') // 去掉前导0
                                           .replace(/^(\d{1,2})\.(\d{2}).*$/, '$1.$2') // 限制小数部分两位
                                           .replace(/^([1-9]\d?|0)(\.\d{0,2})?.*/, '$1$2'); // 限制整数部分在0-99之间
        }
      }
    }
  };
  </script>
  
  

(5)身份证校验

html 复制代码
<template>
    <div>
      <el-input
        v-model="inputValue"
        @input="inputValue = handleInput(inputValue)"
        placeholder="请输入18位身份证号码"
        maxlength="18"
      ></el-input>
    </div>
  </template>
  
  <script>
  export default {
    data() {
      return {
        inputValue: ''
      };
    },
    methods: {
      handleInput(value) {
        // 过滤掉非数字和非字母X/x字符
        let filteredValue = value.replace(/[^0-9xX]/g, '');
        
        // 如果长度超过18位则截断
        if (filteredValue.length > 18) {
          filteredValue = filteredValue.slice(0, 18);
        }
  
        // 确保前17位是数字,最后一位可以是数字或字母X/x
        if (/^\d{0,17}[0-9xX]$/.test(filteredValue)) {
          return filteredValue;
        } else {
          // 如果不符合规则,移除最后一个字符
          return value.slice(0, -1);
        }
      }
    }
  };
  </script>
  

(6)只能输入数字和小数(不限制小数位数)

html 复制代码
<template>
    <div>
      <!-- 使用 @input="inputValue = handleInput(inputValue)" 的形式 -->
      <el-input
        v-model="inputValue"
        @input="inputValue = handleInput(inputValue)"
        placeholder="请输入数字或小数"
        clearable
      ></el-input>
    </div>
  </template>
  
  <script>
  export default {
    data() {
      return {
        inputValue: ''
      };
    },
    methods: {
      handleInput(value) {
        // 使用正则表达式匹配数字和小数点,不限制小数位数
        const reg = /^(\d+)(\.\d*)?$/;
  
        // 如果匹配正确,返回输入的值;否则返回一个空字符串(或其他默认值)
        if (reg.test(value) || value === '') {
          return value;
        } else {
          return '';  // 返回一个空字符串或者你想要的默认值
        }
      }
    }
  };
  </script>
  
相关推荐
崔庆才丨静觅5 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60616 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了6 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅6 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅6 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅7 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment7 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅7 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊7 小时前
jwt介绍
前端
爱敲代码的小鱼7 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax