题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解题思路:
- 利用java内置API进行判断,利用将字符串解析为制定类型的变量。
- 利用正则表达式进行判断
方法一:使用double浮点型的包装类Double中的方法,如:parseDouble、valueOf方法。使用方法校验,失败抛异常,在catch中去处理异常,返回false即可。
代码如下:
private static boolean isNumeric(char[] str) {
String string = new String(str);
System.out.println(string);
try {
Double.parseDouble(string);//parseDouble、valueOf任意一个就好。
Double.valueOf(string);
} catch (Exception e) {
return false;
}
return true;
}
parseDouble方法与valueOf方法的差异:parseDouble方法的返回值类型为基础类型double,而valueOf函数返回值类型为Double对象,valueOf源码也是调用的parseDouble.
顺便带大家回顾一下包装类的有关知识吧。
- 有哪些常见的包装类?
基础类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Char |
double | Double |
float | Float |
boolean | Boolean |
- 自动装箱与自动拆箱。
基础类型都有其对应的包装类。
转换方式 | 转换命名 |
---|---|
基础类型---------->包装类型 | 装箱 |
包装类对象---------->基础类型 | 拆箱 |
- 包装类中常用的方法有哪些呢?
包装类中最常用的就是包装类对象与String字符串的转换。常见的方法如下表所示:
常用方法 | 备注 |
---|---|
public static double parseDouble(String s) | 返回一个新的 double初始化为指定的 String所代表的值,通过类的方法进行 Double valueOf。 |
public static Double valueOf(double d) | 返回表示指定的 double价值 Double实例。 |
public static String toHexString(double d) | 返回的 double类型的数的一个十六进制字符串表示形式 |
public String toString() | 返回该对象的字符串表示 Double。 |
方法二:直接使用String对象的matches方法,利用正则表达式进行判断。
/**
* @Description: TODO(
[\\+\\-]? 正或负符号出现与否
\\d* 整数部分是否出现,如-.34 或 +3.34均符合
(\\.\\d+)? 如果出现小数点,那么小数点后面必须有数字;否则一起不出现
([eE][\\+\\-]?\\d+)? 如果存在指数部分,那么e或E肯定出现,+或-可以不出现,紧接着必须跟着整数;或者整个部分都不出现
)
* @param str
* @return
* @author Mr.Wang
* @date 2020-07-05 12:18:18
*/
private static boolean isNumeric2(char[] str) {
return new String(str).matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
}
这里对于正则表达式比较熟悉的同学对于这种方法可以说是小菜一碟,正则表达式的方便也不是一点两点,熟练使用正则表达式可以为编码节省大量的时间,下面跟大家一起学习一下正则表达式常用的表达方式吧。
表达式 | 匹配字符 | 举例 |
---|---|---|
\r, \n | 回车、换行符 | 无 |
\\ | 表示\本身(特殊符号前加\表示符号本身) | \.表示小数点本身 |
$ | 与字符串结束的地方匹配,不匹配任何字符 | 表达式 “aaa$” 在匹配 “xxx aaa xxx” 时,匹配结果是:失败。因为 “$” 要求与字符串结束的地方匹配,因此,只有当 “aaa” 位于字符串的结尾的时候,“aaa$” 才能匹配,比如:“xxx xxx aaa”。 |
^ | 与字符串开始的地方匹配,不匹配任何字符 | 表达式 “^aaa” 在匹配 “xxx aaa xxx” 时,匹配结果是:失败。因为 “^” 要求与字符串开始的地方匹配,因此,只有当 “aaa” 位于字符串的开头的时候,"^aaa" 才能匹配,比如:“aaa xxx xxx”。 |
* | 表达式不出现或出现任意次,相当于 {0,} | 比如:"^*b"可以匹配 “b”,"^^^b" |
? | 匹配表达式0次或者1次,相当于 {0,1} | 比如:"a[cd]?"可以匹配 “a”,“ac”,“ad” |
+ | 表达式至少出现1次,相当于 {1,} | 比如:"a+b"可以匹配 “ab”,“aab”,“aaab” |
{n} | 表达式重复n次 | 比如:"\w{2}" 相当于 “\w\w”;“a{5}” 相当于 “aaaaa” |
{m,n} | 表达式至少重复m次,最多重复n次 | 比如:"ba{1,3}"可以匹配 “ba"或"baa"或"baaa” |
{m,} | 表达式至少重复m次 | 比如:"\w\d{2,}“可以匹配 “a12”,”_456",“M12344” |
[ab5@] | 匹配 “a” 或 “b” 或 “5” 或 “@” | 比如:abc可以匹配到a、b |
[^abc] | 匹配 “a”,“b”,“c” 之外的任意一个字符 | 比如:“adef”可以匹配到d、e、f |
[f-k] | 匹配 “f”~“k” 之间的任意一个字母 | 比如:“adef”可以匹配到f |
[^A-F0-3] | 匹配 “A”“F”,"0"“3” 之外的任意一个字符 | 比如:“a345”可以匹配到a、4、5 |