2015-09-05 128 views
1
import java.util.*; 

class Dis { 

    static boolean Digitinstring(String s) { 
     boolean result = false; 
     int i, j; 
     char[] ch = s.toCharArray(); 
     int x = ch.length; 
     for (j = 0; j < x; j++) { 

      for (i = 0; i <= 9; i++) { 

       if (ch[j] == i) { 
        System.out.println("True"); 
        result = true; 
       } else { 
        result = false; 
       } 

      } 
     } 
     return result; 
    } 

    public static void main(String args[]) { 
     System.out.println("Enter the string"); 
     Scanner ob = new Scanner(System.in); 
     String s = ob.nextLine(); 
     System.out.println(Digitinstring(s)); 
    } 
} 

此代码始终给出答案false。 if条件不起作用。 我能做些什么才能使它正常工作?如何判断字符串中是否有数字?

+1

删除'else'部分。 'ch [j]'包含'char',但'i'是'int',''2'== 2'永远不会是真的。 – Pshemo

+0

你只想知道是否有字符串中的数字或不正确的,那么它很简单,你不需要编写嵌套循环我会在几分钟内上传一个相同的工作程序 –

回答

1
/* Note: 48 to 57 is ascii values of 0,1, 2,...9 respectively 
    code is made more readable ascii values are not used now 
*/ 
package com; 

import java.util.Scanner; 

public class Dis { 
    public static void main(String[] args) { 
     System.out.println("Enter the string"); 
     Scanner ob = new Scanner(System.in); 
     String s = ob.nextLine(); 
     System.out.println(Digitinstring(s)); 
     ob.close(); 
    } 

    private static boolean Digitinstring(String s) { 
     boolean result = false; 
     for (int j = 0; j < s.length(); j++) { 
      if(s.charAt(j)>='0' && s.charAt(j)<='9') 
      { 
       result=true; 
       break; 
      } 
     } 
     return result; 
    } 
} 
+0

不需要编写嵌套循环检查上面的解决方案,并使用break语句来避免额外的迭代 –

+2

'(int)s.charAt(j)> = 48'(1)你不需要强制转换为'int',字符可以被视为整数,如果需要像在这种情况下(2)避免[幻数](http://stackoverflow.com/questions/47882/what-is-a-magic-number-and-why-is-it-bad ) - 你可以将你的代码重写为if(s.charAt(j)> ='0'&& s.charAt(j)<='9')'这样更容易阅读(或者你可以使用'Characters .isDigit') – Pshemo

+0

谢谢Pshemo我编辑了我的代码,请告诉我如果我可以进一步改进代码 –

4

您的代码失败,因为'3'确实是而不是等于3.字符3,即您的ch [j]永远不会等于实际的整数,因为它们具有不同的类型。如果你想要这个工作,你应该用这个代替您,如果条件:

Character.getNumericValue(ch[j]) == i; 

这种比较简单的方法是简单地使用

Character.isDigit(s.charAt(j)); 

你的整个方法是这样的:

public static boolean digitInString(String s){ 


    for(int i = 0; i<s.length(); i++){ 

     if(Character.isDigit(s.charAt(i))){ 
      return true; 
     } 


    } 
    return false; 

} 
1

问题很少。首先是您的else区块。请记住,在if(){1}else{2}的情况下,必须始终执行两个块中的任意一个,它们将是{1}{2}
这意味着您的result将仅取决于最后的测试,换句话说,最后一个字符。
要解决此问题,请删除else区块并让result仅当您的测试会找到数字时才会存储true

第二个问题是,在(ch[j] == i)您正在比较charint。所以,你喜欢的东西
if ('2' == 2)这是Java假结束了,因为'2' INT表示是其index in Unicode Table,这是50

所以当你看到像'2'==2条件相同50==2哪个是假的。

要生成包含数字的所有字符,你可以简单的写for (char digit = '0'; digit<='9'; digit++)像这样的代码:

static boolean DigitInString(String s) { 
    for (char ch : s.toCharArray()) { 
     for (char digit = '0'; ch <= '9'; ch++) { 
      if (ch == digit) { 
       System.out.println("True"); 
       return true; 
      } 
     } 
    } 
    return false; 
} 

您还可以提高代码的可读性和替换此嵌套循环

 for (char digit = '0'; ch <= '9'; ch++) { 
      if (ch == digit) { 
       System.out.println("True"); 
       return true; 
      } 
     } 

 if (Character.isDigit(ch)){ 
      System.out.println("True"); 
      return true; 
     } 

此方法将检查字符是否位于为Unidoce表中的数字字符指定的范围内。

+0

@downvote我的朋友,我没有在一段时间内看到你。什么风把你吹到这儿? – Pshemo

0

您有一个问题:

for (i = 0; i <= 9; i++) { 
    if (ch[j] == i) { 
     System.out.println("True"); 
     result = true; 
    } else { 
     result = false; 
    } 
} 

CH [j]为一个字符,i是一个数,因此,字符“0”具有46的数值(如果我记错),所以您可以通过添加 '0' 我纠正这种情况的if语句

if (ch[j] == i+'0') { 

或修改for循环

for (i = '0'; i <= '9'; i++) { 

注意在这种情况下0是一个字符。

2

您可以使用正则表达式来获得更紧凑的代码。正则表达式正好适合您的场景,它正在Strings中寻找特定的模式。在你Digitinstring,你可以做到以下几点:(。*)(。*)

return s.matches(".*\\d.*"); 

,如果你的字符串有任何数目的字符返回true,后面跟着一个数字(\\ d)后跟任意数量的字符。任何数量的字符都可以包含0.

Swailem95的帖子很好地解释了为什么您当前的实现没有返回预期结果。

0

如果(CH [J] == I)

请更正上述比较相同对象类型,您目前使用的不同类型的从来都不是真实情况。或者使用Character Class的内置isDigit方法。

+1

“*你目前使用的不同类型永远不会是真的*”不是真的,''2'== 50'在不同类型('char'和'int')下被评估为'true'。问题在于价值,而不是类型。具有相同的类型只是简单易用。 – Pshemo

相关问题