当前位置: 首页 > article >正文

数字处理系列

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

<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限制只能输入正整数

<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,并且小数部分最多只能输入两位小数。(适用于输入金额场景)

<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 时不能输入小数(适用于百分比)

<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)身份证校验

<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)只能输入数字和小数(不限制小数位数)

<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>
  

http://www.kler.cn/news/358750.html

相关文章:

  • 51单片机快速入门之 LCD1602 液晶显示屏 结合 数字键盘的运用 2024/10/20
  • Linux 使用 Split 命令分割文件与合并
  • 13.4 Linux_网络编程_套接字属性
  • 【设计模式系列】装饰器模式
  • 自动驾驶系列—CI在自动驾驶开发中的应用场景与实现详解
  • 说了很久的建筑转大模型,也不过是想在职场完成赎身
  • 深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
  • SpringBoot框架的车辆管理自动化解决方案
  • 「漏洞复现」英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞
  • OpenCV的常用与形状形状描述相关函数及用法示例
  • VSCODE c++不能自动补全的问题
  • Qt- JSONXML
  • 高频SQL50题(基础版)三
  • 安全升级:索尔德三款产品获得防爆合格证
  • 知识付费专业知识讲解
  • springboot优质鸭梨的培育管理系统-计算机毕业设计源码92834
  • 音频/视频提取器:Python和moviepy实现
  • 基于正常重建的图像异常检测方法
  • CICD持续集成交付与持续交付
  • 【力扣打卡系列】滑动窗口与双指针(三数之和)