如何从未知大小的字符串中获取数字(Java)

时间:2016-09-03 18:15:57

标签: java list casting type-conversion

我正在制作程序的一部分,该程序将检查输入JTextArea的字符串是否为数字,如果是,则字符串包含的数字(顺便说一句,不是整个字符串包含数字,而且我不喜欢不知道这个数字是多少位数。我已经知道如何从JTextArea获取字符串以及如何检查字符串是否包含数字。但我不知道如何从字符串中获取确切的数字。以下是我正在使用的两种方法:

//no problems with this method, it's just here for reference.
public static boolean isNum(char[] c, int index){
   //I want to include numbers 0-9
   for(int i = 0; i < 10; i++){
      if(c[index].equals(i(char)) || c[index].equals('.')){
         return true;
      }
   }
   //if the character is not a number 0-9, it is not a number, thus returning false.
   return false;
}

//I need a string parameter to make it easier to get the text from the JTextArea
public static float checkNum(String s){
    //a List to hold the digits
    List<Char> digits = new List<Char>();
    //a char array so I can loop through the string
    char[] c = s.toCharArray();

    for(int i = 0; i < c.length(); i++){
        //if the character is not a number, break the loop
        if(!isNum(c[i])){
            break;
        }
        else{
            //if the character is a number, add it to the next digit
            digits.add(c[i]);
        }
    }
//insert code here.
}

也许我应该将char列表转换回char数组,然后将其转换为字符串,然后将其转换为float?如果是这样,我该怎么做?

编辑:谢谢大家,我看了正则表达式,但我不认为这样做。我正在寻找带有未知位数的一个号码。我知道这个数字最后会有一个空格(或者至少是一个非数字值)。

2 个答案:

答案 0 :(得分:3)

您应该使用正则表达式。在java中,你可以遍历每个数字实例,如下所示:

java.util.regex.Pattern;
java.util.regex.Matcher;

Pattern p = Pattern.compile("\\d+?\\.\\d+");
Matcher m = p.matcher(inputString);

while(m.find())
  //do some string stuff

或者您可以通过用以下内容替换while循环来查找字符串中的一个匹配和一组数字:

String digits = m.group(1);
double number = Double.valueOf(digits);

有关其工作原理的更多信息,请查找正则表达式。此网站特别有用https://regexone.com/

答案 1 :(得分:0)

您可以使用正则表达式来测试和提取任意长度的数字。 这是一个简单的示例方法:

public Integer extractNumber(String fromString){
    Matcher matcher = Pattern.compile("\\D*(\\d+)\\D*").matcher(fromString);
    return (matcher.matches()) ? new Integer(matcher.group(1)) : null;
}

如果要处理数字中的小数,可以将方法更改为:

public Double extractNumber(String fromString){
    Matcher matcher = Pattern.compile("\\D*(\\d+\\.?\\d+)\\D*").matcher(fromString);
    return (matcher.matches()) ? new Double(matcher.group(1)) : null;
}