JAVA算法:校验数字(Valid Number)JAVA版本

JAVA算法:校验数字(Valid Number)JAVA版本

验证给定的字符串是否可以解释为十进制数字。

例如:

"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3   " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false

说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:

数字 0-9
指数 - "e"
正/负号 - "+"/"-"
小数点 - "."


题目分析

题目是给定一个字符串,判断该字符串是否表示的是一个数字。

对于给定的字符串,可以使用正则表达式进行判断:

public boolean isNumber(String s) {
        String regex = "\\s*(\\+|-)?(\\d+|(\\d+\\.\\d*)|(\\d*\\.\\d+))(e(\\+|-)?\\d+)?\\s*";
        return s.matches(regex);
}

 两种不同的正则表达式写法:

 public boolean isNumber(String s) {
         return s.trim().matches("^[+-]?("
                                + "(\\d+(\\.\\d*)?(e[+-]?\\d+)?)" 
                                + "|((\\.\\d+)(e[+-]?\\d+)?))$");
 }

还有一种判断方法是,使用Double类的parseDouble()方法进行转换。

public boolean isNumber(String s) {
		// 处理非法长度的字符串
		if (s == null || s.length() == 0)
			return false;
		//设定返回标记,初始值为true
		boolean flag = true;
		//去空格
		s = s.trim();
		try {
			//使用了Double类的parseDouble方法,将所给的字符串转换为double类型的数
			double d = Double.parseDouble(s);
			//判断浮点数,标志位为 f,或者 D
			if (s.charAt(s.length() - 1) == 'f' || s.charAt(s.length() - 1) == 'D') {
				flag = false;
			}
		} catch (Exception e) {
			flag = false;
		}
		return flag;
}

但是注意:.58e1+9,这种表达方法有点异常。

boolean flag=vn.isNumber(".58e1+9");

算法设计

package com.bean.algorithm.basic;

public class ValidNumber {

	public boolean isNumber(String s) {
		if (s == null || s.length() == 0)
			return false;

		s = s.trim();
		int len = s.length();
		if (len == 0)
			return false;

		int signCount = 0;
		boolean hasE = false;
		boolean hasNum = false;
		boolean hasPoint = false;

		for (int i = 0; i < len; i++) {
			char ch = s.charAt(i);

			if (ch >= '0' && ch <= '9') {
				hasNum = true;
			} else if (ch == 'e' || ch == 'E') {
				if (hasE || !hasNum || i == len - 1)
					return false;
				hasE = true;
			} else if (ch == '.') {
				if (hasPoint || hasE)
					return false;
				// 0. is true
				if (i == len - 1 && !hasNum)
					return false;
				hasPoint = true;
			} else if (ch == '+' || ch == '-') {
				// two signs at most; should not appear in the end
				if (signCount == 2 || i == len - 1)
					return false;
				// sign appears in the middle but no E/e
				if (i > 0 && !hasE)
					return false;
				signCount++;
			} else
				return false;
		}

		return true;
	}
	
	public static void main(String[] args) {
		ValidNumber vn=new ValidNumber();
		boolean flag=vn.isNumber("2e10");
		System.out.println("Flag is: "+flag);
	}

}

程序运行结果:

Flag is: true

 

你可能感兴趣的:(算法分析与设计,JAVA算法学习)