如何检查字符串是否为数字

时间:2011-09-29 12:42:22

标签: java arrays hashmap

我已经转换为Core Java中的Map问题。

以下是要求:
给定

下面的String数组
String str[] = {"abc","123","def","456","ghi","789","lmn","101112","opq"};          

将其转换为Map,使得结果输出低于

输出

======      ======         
key         Value        
======      ======                  
abc          true       
123          false       
def          true      
456          false

应该为数组中的每个元素打印上面的内容。我已经编写了代码,但它没有工作,我被卡住了。请让我知道如何解决。提前致谢。

import java.util.HashMap;       
import java.util.Iterator;       
import java.util.Map;       

public class CoversionToMap {

/**
 * @param args
 */
public static void main(String[] args) {
    String str[] = {"abc","123","def","456","ghi","789","lmn","101112","opq"};
    Map m = new HashMap();
    for(int i=0;i<str.length;i++){
        if(Integer.parseInt(str[i]) < 0){
            m.put(str[i],true);
        }else{
            m.put(str[i],false);
        }
    }
    //Print the map values finally
    printMap(m);
}   

public static void printMap(Map mp) {
        Iterator it = mp.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pairs = (Map.Entry)it.next();          
            System.out.println(pairs.getKey() + " = " + pairs.getValue());
        }
}  
}           

异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"       
    at java.lang.NumberFormatException.forInputString(Unknown Source)       
    at java.lang.Integer.parseInt(Unknown Source)       
    at java.lang.Integer.parseInt(Unknown Source)       
    at CoversionToMap.main(CoversionToMap.java:22)       

12 个答案:

答案 0 :(得分:7)

每个人都建议使用异常处理,这里没有什么例外可以保证使用这样的例外情况,你不要尝试在你的车里左转,如果你崩溃了,你呢?像这样的东西应该这样做

Map<String, Boolean> m = new HashMap<String, Boolean>();
for (String str: strs) {
    m.put(str, isInteger(str));
}

public boolean isInteger(String str) {
    int size = str.length();

    for (int i = 0; i < size; i++) {
        if (!Character.isDigit(str.charAt(i))) {
            return false;
        }
    }

    return size > 0;
}

捕捉抛出异常更加清晰和高效,即使有99%的整数,因为甚至不需要整数值,因此不需要转换。

答案 1 :(得分:5)

Integer.parseInt(..)会因无效输入而抛出异常。

您的if子句应如下所示:

if (isNumber(str[i])) {
   ...
} else {
   ...
}

isNumber可以多种方式实施。例如:

  • 使用try { Integer.parseInt(..) } catch (NumberFormatException ex)(请参阅this相关问题)
  • 使用commons-lang NumberUtils.isNumber(..)

答案 2 :(得分:3)

检查parseInt是否返回小于0的数字,以查看输入是否为非数字。

但是,如果输入为非数字,则该方法不会返回任何值)。相反,正如您所见,它会抛出an exception

执行所需操作的最简单方法是捕获该异常并采取相应措施:

try {
  Integer.parseInt(str[i]);
  // str[i] is numeric
} catch (NumberFormatException ignored) {
  // str[i] is not numeric
}

答案 3 :(得分:3)

如果要检查字符串是否是有效的Java编号,可以使用isNumber中的方法org.apache.commons.lang.math(文档:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/math/NumberUtils.html)。

这样您就不必编写自己的isNumber

实现

答案 4 :(得分:1)

您需要使用try / catch块而不是测试parseInt的返回值。

try {
    Integer.parseInt(str[i]);
    m.put(str[i],true);
} catch(NumberFormatException e) {
    m.put(str[i],false);
}

答案 5 :(得分:1)

您的错误发生在此处:

if(Integer.parseInt(str[i]) < 0){

当输入不是数字时,Integer.parseInt会抛出NumberFormatException,因此您需要使用try / catch块,例如:

try{
    int number = Integer.parseInt(str[i]);
    m.put(str[i],false);
}catch NumberFormatException nfe{
    m.put(str[i],true);
}

答案 6 :(得分:1)

假设您不使用任何外部库,您还可以使用正则表达式匹配器来执行此操作。就像

for (String element : str) {
     m.put(element, element.matches("\\d+"));
}

请注意,这仅适用于非负整数,但您可以调整正则表达式以匹配要映射为true的数字格式。此外,如果元素为null,您将获得NullPointerException,因此此处需要一些防御性代码。

答案 7 :(得分:1)

这是一个改进的答案,可用于具有负值,小数点等的数字。它使用Regular Expressions

在这里:

public class StringValidator {

    public static void printMap(Map<String, Boolean> map) {
        Iterator it = map.entrySet().iterator();
        for(Map.Entry<String, Boolean> entry:map.entrySet()){
            System.out.println(entry.getKey()+" = "+ entry.getValue());
        }
    }
}

class ValidateArray{
        public static void main(String[] args) {
        String str[] = {"abcd", "123", "101.112", "-1.54774"};
        Map<String, Boolean> m = new HashMap<String, Boolean>();
        for (String s : str) {
            m.put(s, isNumber(s));
        }
        StringValidator.printMap(m);
    }

    public static boolean isNumber(String str) {
        Pattern pattern = Pattern.compile("^-?\\d+\\.?\\d*$");
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }
}

答案 8 :(得分:0)

用对isInteger(str [i])的调用替换你的parseInt行,其中isInteger的定义如下:

public static boolean isInteger(String text) {
  try {
    new Integer(text);
    return true;
  } catch (NumberFormatException e) {
    return false;
  }
}

答案 9 :(得分:0)

我想在这里输入“不要使用异常处理”的相反观点。以下代码:

try
{
  InputStream in = new FileInputStream(file);
}
catch (FileNotFoundException exc)
{
  // ...
}

完全等同于:

if (!file.exists())
{
  // ...
}
else
try
{
  InputStream in = new FileInputStream(file);
}
catch (FileNotFoundException exc)
{
 // ...
}

除了在前一种情况下:

  1. 仅检查文件是否存在
  2. 两次检查之间没有时间窗口可以改变。
  3. //处理只能编程一次。
  4. 所以你没有看到像第二种情况那样的代码。至少你不应该。

    本案例相同,只是因为它是String没有时间窗口。 Integer.parseInt()无论如何都必须检查输入的有效性,并抛出异常,无论如何都必须在某处捕获(除非你喜欢RTE停止你的线程)。为什么要做两次呢?

    你不应该使用异常进行正常流量控制的反驳论点只是引出了一个问题。 它是正常的流量控制吗?或者是输入中的错误? [事实上,我总是理解这个原则更具体地意味着“不要在方法中抛出异常”,即使这样,在极少数情况下这是最好的答案。我不喜欢任何形式的一揽子规则。]

    另一个在ObjectInputStream上检测EOF的示例。你可以通过捕捉EOFException来实现。除了为流添加前缀之外没有其他方法,这是设计更改和格式更改。那么,EOF是正常流量的一部分,还是一个例外?如果通过异常报告,它如何成为正常流程的一部分?

答案 10 :(得分:0)

这是一种更通用的方法来验证,避免异常,并使用Format子类已经知道的内容。例如,SimpleDateFormat知道2月31日无效,只要你告诉它是宽松的。

import java.text.Format;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

public class ValidatesByParsePosition {

    private static NumberFormat _numFormat = NumberFormat.getInstance();
    private static SimpleDateFormat _dateFormat = new SimpleDateFormat(
            "MM/dd/yyyy");

    public static void printMap(Map<String, Boolean> map) {

        for (Map.Entry<String, Boolean> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
    }

    public static void main(String[] args) {

        System.out.println("Validating Nums with ParsePosition:");
        String numStrings[] = { "abcd", "123", "101.112", "-1.54774", "1.40t3" };
        Map<String, Boolean> rslts = new HashMap<String, Boolean>();
        for (String s : numStrings) {
            rslts.put(s, isOk(_numFormat, s));
        }
        ValidatesByParsePosition.printMap(rslts);

        System.out.println("\nValidating dates with ParsePosition:");
        String dateStrings[] = { "3/11/1952", "02/31/2013", "03/14/2014", 
                "05/25/2014", "3/uncle george/2015" };
        rslts = new HashMap<String, Boolean>();
        _dateFormat.setLenient(false);
        for (String s : dateStrings) {
            rslts.put(s, isOk(_dateFormat, s));
        }
        ValidatesByParsePosition.printMap(rslts);
    }

    public static boolean isOk(Format format, String str) {

        boolean isOK = true;
        int errorIndx = -1;
        int parseIndx = 0;

        ParsePosition pos = new ParsePosition(parseIndx);

        while (isOK && parseIndx < str.length() - 1) {
            format.parseObject(str, pos);
            parseIndx = pos.getIndex();
            errorIndx = pos.getErrorIndex();
            isOK = errorIndx < 0;
        }

        if (!isOK) {
            System.out.println("value \"" + str
                    + "\" not parsed; error at char index " + errorIndx);
        }

        return isOK;
    }

}

答案 11 :(得分:-1)

boolean intVal = false;
    for(int i=0;i<str.length;i++) {
            intVal = false;
            try {
                if (Integer.parseInt(str[i]) > 0) {
                    intVal = true;
                }
            } catch (java.lang.NumberFormatException e) {
                intVal = false;
            }
        m.put(str[i], !intVal);
    }