博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA算法:校验数字(Valid Number)JAVA版本
阅读量:4039 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
[leetcode BY python]1两数之和
查看>>
微信小程序开发全线记录
查看>>
Centos import torchvision 出现 No module named ‘_lzma‘
查看>>
PTA:一元多项式的加乘运算
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
Django 的Error: [Errno 10013]错误
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[leetCode By Python] 14. Longest Common Prefix
查看>>
[LeetCode By Python]118. Pascal's Triangle
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>