A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Elvismao

初级黑马

  • 黑马币:45

  • 帖子:42

  • 精华:0

© Elvismao 初级黑马   /  2014-12-12 10:33  /  2058 人查看  /  19 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

这个问题其实没那么简单,因为我认为负数,实数都是数字;用正则表达式可能会简单些,不过对正则现在有点晕。怎么用代码实现上述功能?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

19 个回复

倒序浏览
注:不能用各种基本数据的包装类,比如Double类的各种方法。
回复 使用道具 举报
你这个问题有些意思,你是说用正则的匹配法么,但是你这个范围太大了,数字这个东西,负数还好,实数就分成好多种呢
回复 使用道具 举报
ppStudent 发表于 2014-12-12 10:53
你这个问题有些意思,你是说用正则的匹配法么,但是你这个范围太大了,数字这个东西,负数还好,实数就分成 ...

其实用Double类的转换是可以实现的,用Try..Catch捕捉就行。我所说的实数其实可以理解为Double类型数据,不包括科学记数法。
回复 使用道具 举报
我的思路是首先这个字符串的每一个字符都必须是 . 数字或者符号这三种之一,如果你考虑复数那情况更多。
回复 使用道具 举报
本帖最后由 Optimus 于 2014-12-12 11:04 编辑

这个也可以,没用到正则表达式,用Character包装类进行判断
  1. public class TestNumber {
  2.         public static void main(String[] args) {
  3.                 Scanner in = new Scanner(System.in);
  4.                 String str = in.nextLine();
  5.                 if(isNum(str)){
  6.                         System.out.println("数字");
  7.                 }else{
  8.                         
  9.                         System.out.println("字符串");
  10.                 }
  11.         }
  12.         public static boolean isNum(String str){
  13.                 for(int i = 0; i <str.length(); i++){
  14.                         if(!Character.isDigit(str.charAt(i))){
  15.                                 return false;
  16.                         }
  17.                 }
  18.                 return true;
  19.         }

  20. }
复制代码

点评

这个不行,有很大缺陷,负数呢?小数点呢?  发表于 2014-12-12 11:31
回复 使用道具 举报 0 1
charAt()方法返回的就是一个字符,你在判断它是不是字符有何意义?你看我的
  1. public static String getName()//获取一个阿拉伯数字形式金额
  2.         {
  3.                 System.out.println("请输入一个阿拉伯数字形式的金额:");
  4.                 BufferedReader br=null;
  5.                 String s="";
  6.                 try
  7.                 {
  8.                         br=new BufferedReader(new InputStreamReader(System.in));
  9.                         s=br.readLine();
  10.                         char[] arr=s.toCharArray();
  11.                         int count=0;
  12.                         for(int i=0;i<arr.length;i++)//对这个输入的数字进行判断,不和规矩则直接抛出RuntimeException
  13.                         {
  14.                                 if(arr[i]!='.'&&!(arr[i]>='0' && arr[i]<='9'))
  15.                                         throw new MyExceptiones("对不起!请输入阿拉伯数字!");
  16.                                 if(arr[i]=='.')
  17.                                         count++;
  18.                                 if(count>=2)
  19.                                         throw new MyExceptiones("对不起!请输入阿拉伯数字!");
  20.                         }
  21.                 }
  22.                 catch(IOException e)
  23.                 {
  24.                         e.printStackTrace();
  25.                 }
  26.                 finally
  27.                 {
  28.                         try
  29.                         {
  30.                                 br.close();
  31.                         }
  32.                         catch(IOException e)
  33.                         {
  34.                                 e.printStackTrace();
  35.                         }
  36.                 }
  37.                 return s;
复制代码
回复 使用道具 举报
看错了,isDigit()方法是判断这个字符是否是数字。。汗。。

点评

如果我在控制台输入“34.21.23.”,这个显然不是数字。  发表于 2014-12-12 11:32
回复 使用道具 举报
Optimus 发表于 2014-12-12 10:59
这个也可以,没用到正则表达式,用Character包装类进行判断

你这个不行,有很大缺陷,再琢磨琢磨。
回复 使用道具 举报
Elvismao 发表于 2014-12-12 11:30
你这个不行,有很大缺陷,再琢磨琢磨。

只有用正则表达式最好了,可以满足所有情况,恶补下正则表达式先
回复 使用道具 举报
Optimus 发表于 2014-12-12 11:46
只有用正则表达式最好了,可以满足所有情况,恶补下正则表达式先

正则表达式是不是这样的"[0-9]+\\.[0-9]+"这样吧?小数点前面有0-9的数字至少一个,小数点后面的数字也是0-9至少一个这样?
回复 使用道具 举报
........................
回复 使用道具 举报
ppStudent 发表于 2014-12-12 12:24
正则表达式是不是这样的"[0-9]+\\.[0-9]+"这样吧?小数点前面有0-9的数字至少一个,小数点后面的数字也是 ...

我思考了一下,情况应该是这样的:
1,字符串里边只能是0-9的数字、负号以及小数点;
2,负号和小数点最多出现一次,且负号只能出现在第一位,小数点不能出现在第一位和最后一位,如果负号在第一位,那么第二位还不能是小数点,有点复杂~;
3,如果还要排除像“0092”以及“-0092”这样的数字序列,那么情况将更加复杂。
看似一个简单的问题,其实如果要写出一段完美健壮的代码,很不简单。
回复 使用道具 举报
冥夜 中级黑马 2014-12-12 14:31:43
14#
- -直接强转不行么。。如果强转失败就说明不是数字,成功了就说明是数字了
回复 使用道具 举报
大家看下这个怎么样,欢迎大家提出意见共同改进。
  1. public class TestNumber {
  2.         public static void main(String[] args) {
  3.                 Scanner in = new Scanner(System.in);
  4.                 System.out.println("请输入:");
  5.                 String str = in.nextLine();
  6.                 if (isNum(str)) {
  7.                         System.out.println("数字");
  8.                 } else {
  9.                         System.out.println("字符串");
  10.                 }
  11.         }
  12.         public static boolean isNum(String str) {
  13.                 Pattern p = Pattern.compile("-?[0-9]+.?[0-9]*[^A-Za-z]");
  14.                 Matcher m = p.matcher(str);
  15.                 if(m.matches()){
  16.                         return true;
  17.                 }else{
  18.                         return false;
  19.                 }
  20.         }
  21. }
复制代码
回复 使用道具 举报
强烈表示未学正则呢还 。。。。
回复 使用道具 举报
冥夜 发表于 2014-12-12 14:31
- -直接强转不行么。。如果强转失败就说明不是数字,成功了就说明是数字了 ...

我之前就说了不能用包装类的强制转换,因为这样其实回避了这个问题,把判断交给了虚拟机;我在这里讨论的是解决这个问题的算法。
回复 使用道具 举报
Scanner sc=new Scanner(System.in);
if(sc.hasNextDouble()){
        System.out.println("你输入的数字为:"+sc.nextDouble());
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马