本文共 2540 字,大约阅读时间需要 8 分钟。
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
转载地址:http://pitdi.baihongyu.com/