IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 表示数值的字符串 -- java -> 正文阅读

[Java知识库]表示数值的字符串 -- java

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如,字符串 “+100”,“5e2”,"-123",“3.1416” 和 “-1E-16” 都表示数值。但是 “12e”,“1a3.14”,“1.2.3”,“±5” 和 “12e+4.3” 都不是。

解题思路

非正则表达式解法

表示数值的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC]
其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着’e’或者‘E’为数值的指数部分。在小数里可能没有数值的整数部分。例如,小数.123等于0.123。因此A部分不是必需的,如果一个数没有整数部分,那么它的小数部分不能为空。

上诉A和C都是可能以‘+’或者‘-’开头的0-9的数字串;B也是0-9的数位串,但前面不能有正负号。

判断一个字符串是否符合上述模式时,首先尽可能多地扫描0-9的数位(有可能在起始处有‘+’或者‘-’),也就是前面模式中表示数值的A部分,如果遇到小数点’.’,则开始扫描数值小数部分的B部分。如果遇到’e’或者‘E’,则开始扫描数值指数的C部分。

正则表达式解法

使用正则表达式进行匹配:

[]  : 字符集合
()  : 分组,在这里是为了让表达式更清晰
?   : 重复 0 ~ 1+   : 重复 1 ~ n 次
*   : 重复 0 ~ n 次
.   : 任意字符
\\. : 转义后的.
\\d : 任意数字

代码

非正则表达式解法

public class IsNumberic {
    // 定义str的索引位置
    private static int i = 0;

    public static boolean isNumberic(char[] str) {
        // 防止非法输入
        if (str == null) {
            return false;
        }

        // 1. 扫描A
        boolean numberic = scanInteger(str);

        // 2. 扫描B
        if (i < str.length && str[i] == '.') {
            i++;
            // 下面一行代码用||的原因
            // 1. 小数可以没有整数部分,如.123等于0.123
            // 2. 小数点后面可以没有数字,如233.等于233.0
            // 3. 当然,小数点前面和后面可以都有数字,如233.666
            numberic = numberic || scanUnsignedInteger(str);
        }

        // 3. 扫描C
        if (i < str.length && (str[i] == 'e' || str[i] == 'E')) {
            i++;
            // 下面一行代码用&&的原因:
            // 1.当e或者E前面没有数字时,整个字符串不能表示数字,如.e1、e1;
            // 2.当e或者E后面没有整数时,整个字符串不能表示数字,如12e、12e+5.4;
            numberic = numberic && scanInteger(str);
        }
        return numberic && i == str.length;
    }

    // 扫描是否有 无符号整数部分(在起始处不可能有‘+’或者‘-’)
    public static boolean scanUnsignedInteger(char[] str) {
        int before = i;
        while (i < str.length && str[i] >= '0' && str[i] <= '9') {
            i++;
        }
        return i > before;
    }

    // 扫描是否有 整数部分(有可能在起始处有‘+’或者‘-’)
    public static boolean scanInteger(char[] str) {
        if (i < str.length && (str[i] == '+' || str[i] == '-')) {
            i++;
        }
        return scanUnsignedInteger(str);
    }

    // 测试
    public static void main(String[] args) {
        String str = "+100";
        System.out.println(isNumberic(str.toCharArray())); // true

        // 将索引i恢复为0
        i = 0;

        str = "5e2";
        System.out.println(isNumberic(str.toCharArray())); // true

        // 将索引i恢复为0
        i = 0;

        str = "12e";
        System.out.println(isNumberic(str.toCharArray())); // false

    }

}

正则表达式解法

// 正则表达式解法
public class isNumberic_2 {
    public static boolean isNumberic_2(String str) {
        // 防止特殊输入
        if (str == null || str.length() < 0) {
            return false;
        }

        return new String(str).matches("[+-]?[\\d]*[\\.]?[\\d]*([eE][+-]?\\d+)?");
    }

    public static void main(String[] args) {
    
        System.out.println(isNumberic_2("233."));
    }
}


来自:
《剑指Offer》
Coding-Interviews/表示数值的字符串.md at master · todorex/Coding-Interviews

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:35:06  更:2021-11-11 12:37:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:05:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码