关于合法浮点数、转义字符、八进制、十六进制、字符常量的判断

简介: 关于合法浮点数、转义字符、八进制、十六进制、字符常量的判断

浮点数


定义: 浮点数是指一个数的小数点的位置不是固定的,而可以浮动。实数的指数形式称为浮点数.

百科

浮点型数据是用来表示具有小数点的实数的. 在C语言中, 实数是以指数形式存放在存储单元中的 .

易错点


  • 小数点前或后缺少数字的,也是合法浮点数. 比如: 0.0、.0、0.
  • 但是前后都缺了,只有一个. , 不是合法的浮点数.
  • 指数形式写作小写e与大写E都合法.不区分大小写.
  • e之前和之后必须有数字(不限制正负), 比如 12e,e12 不合法.,但是12e0合法.
  • 且e之后的数字必须为整数. 比如: 12e3.14 不合法
  • 1000.0与1e3 都是合法的浮点数 .
  • 3.e-0 , .3e0 都是合法的
  • 但是2e.4 , 2e-4. 不合法


输入自动判断是否合法


来自LeetCode第65题: https://leetcode.cn/problems/valid-number/

    public boolean isNumber1(String s) {
        // 直接正则表达式
        return s.matches("^[+-]?((\\d+)|(\\d+\\.\\d*)|(\\d*\\.\\d+))([eE][+-]?\\d+)?$");
    }

或者

List<Character> PlusMinus = new ArrayList<>(Arrays.asList('+', '-'));

    public boolean isNumber(String s) {
        // 1. 纯数字
        if (isPureNumber(s)) return true;
        // 2. 小数点
        if (isDecimalPoint(s)) return true;
        // 3.  e/E
        if (isScientificCM(s)) return true;
        return false;
    }

    /**
     * 判断是否可直接转为数字, 即是否全部为数字
     *
     * @param s
     * @return
     */
    boolean isPureNumber(String s) {
        if (PlusMinus.indexOf(s.charAt(0)) != -1) {
            s = s.substring(1);
        }
        boolean haveNum = false;
        for (char c : s.toCharArray()) {
            if (!Character.isDigit(c)) {
                return false;
            } else {
                haveNum = true;
            }
        }
        return haveNum;

        /* 超界会返回false ,eg:016912630333
        try {
            Integer.parseInt(s);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }*/
    }

    /**
     * 是否合法带小数点
     *
     * @param s
     * @return
     */
    boolean isDecimalPoint(String s) {
        if (PlusMinus.indexOf(s.charAt(0)) != -1) {
            s = s.substring(1);
        }
        int count = 0;
        boolean haveNum = false;
        for (char c : s.toCharArray()) {
            if (c == '.') {
                if (++count > 1) return false;
            } else if (!Character.isDigit(c)) {
                return false;
            } else {
                haveNum = true;
            }
        }
        return haveNum;
    }

    boolean isScientificCM(String s) {
        s = s.toUpperCase();
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == 'E') {
                if (++count > 1 || i == 0 || i == s.length() - 1) return false;
            } else if (!Character.isDigit(s.charAt(i))
                    && s.charAt(i) != '.'
                    && PlusMinus.indexOf(s.charAt(i)) == -1) {
                return false;
            }
        }
        // 如果没有E
        if (count == 0) return false;
        String[] es = s.split("E");
        // 第一部分是否合法
        boolean part1 = isPureNumber(es[0]) || isDecimalPoint(es[0]);
        // 第二部分是否合法
        boolean part2 = isPureNumber(es[1]);
        return part1 && part2;
    }


转义字符


百科:

  • 必须必须带有转义符反斜杠\
  • 只有一个反斜杠的\不合法
  • 在\1011 中1011是八进制形式, 不是二进制,不是十进制,换算后十进制为 521 , 已超出ASCLL码最大值128 , 不合法
  • 在\xf , 以x开头表示以十六进制表示的,转换为十进制为 15. 合法 .
  • \abc , \} , \\0 待定, 编译器不报错,但是会警告. 个人觉得不合法.也有认为\abc合法的.(表示先响铃(\a),再是字符bc)
  • 注意: \f与 \xf 都合法.
  • 但是 \n 合法, \xn 不合法,因为十六进制最大值为f,即15


八进制/十六进制


  • 八进制以0开头标志,比如: 012,表示八进制数12, 也可表示为000012
  • 十六进制以0x或0X开头标识, 比如: 0xab ,但是不可表示为000000xab
  • 十六进制不区分大小写,0xab也可表示为0XAB
  • 0x5e2属于合法十六进制数.但是只有一个0x不合法.


字符常量


所有字符均以单引号' '包裹, 所有以双引号" "包裹的都是字符串.


相关文章
|
前端开发 JavaScript 开发者
水墨代码:前端川的诞生——在夏日阴雨中启航
【前端川】网站于农历五月初一(2024年6月6日)上线,融合水墨画与现代前端技术,呈现独特的水墨代码美学。创建者陈川分享技术心得与实战经验,网站特色包括水墨风格界面、技术深度解析及实战案例。在夏日雨中启航,"前端川"致力于为开发者提供灵感与帮助,探索前端技术的无限可能。
431 17
|
消息中间件 监控 算法
高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】
高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】
763 0
|
Python
Python中的setdefault,set和default
setdefault,set 是设置,default 是默认
1305 0
Python中的setdefault,set和default
|
监控 安全 Java
【面试题】面试必备我跟面试官聊了一个小时线程池!
【面试题】面试必备我跟面试官聊了一个小时线程池!
1433 1
|
自然语言处理 前端开发
收藏级5款免费wordpress主题分享
本文分享了5款值得收藏的免费WordPress主题:1. OceanWP,现代多功能主题,适合电商;2. Divi,高级主题带页面构建器,功能丰富;3. Breakthrough Pro,基于Genesis框架的企业主题;4. Neve,时尚主题支持多语言;5. Ultra,商业主题搭配Themify构建器。每款主题均附有预览图,方便选择。更多主题可访问http://ztmao.com。
633 1
|
存储 安全 数据安全/隐私保护
FileCodeBox:Star4.9k,类似百度网盘,小团队、小公司都用得上的文件共享与分享工具,支持设置分享密码,界面清爽简单易用
FileCodeBox是一款开源文件共享工具,类似百度网盘,适合小团队和公司使用。它支持设置分享密码,界面简洁易用,提供匿名文件和文本分享功能。用户可通过提取码轻松获取文件,支持多种上传方式、文件类型及设备访问。项目基于FastAPI + SQLite3 + Vue3构建,具备轻量、安全、多语言支持等特点
1188 2
|
安全 网络协议 网络安全
如何获取静态IP进行测试?静态IP有什么优点?
本文介绍了如何获取静态IP用于测试,包括联系ISP、使用DDNS和利用VPN。静态IP具有稳定性、安全性和易用性的优点,适合网络测试和特定设置。
关于 getsockname、getpeername和gethostname、gethostbyname
一、gethostname,gethostbyname的用法 这两个函数可以用来获取主机的信息。gethostname:获取主机的名字gethostbyname:通过名字获取其他的信息(比如ip) 1.
1761 0
|
存储 程序员 编译器
C语言:深入补码计算原理
C语言:深入补码计算原理
880 2