如何从java中的输入字符串中提取数值

时间:2012-08-31 13:11:44

标签: java string

如何仅从输入字符串中提取数值?

例如,输入字符串可能如下所示:

String str="abc d 1234567890pqr 54897";

我只想要数字值,"1234567890""54897"。所有字母和特殊字符都将被丢弃。

15 个答案:

答案 0 :(得分:22)

您可以使用.nextInt()类中的Scanner方法:

  

将输入的下一个标记扫描为int。

或者,您也可以这样做:

String str=" abc d 1234567890pqr 54897";

Pattern p = Pattern.compile("(\\d+)");
Matcher m = p.matcher(str);
while(m.find())
{
    System.out.println(m.group(1));
}

答案 1 :(得分:11)

String str=" abc d 1234567890pqr 54897";
Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
Matcher matcher = pattern.matcher(str);
for(int i = 0 ; i < matcher.groupCount(); i++) {
  matcher.find();
  System.out.println(matcher.group());
}

答案 2 :(得分:8)

使用yourString.toCharArray();将字符串拆分为char数组然后遍历字符并使用Character.isDigit(ch);来确定这是否为数值。或者遍历整个字符串并使用str.charAt(i)。例如:

public static void main(String[] args) {
    String str = "abc d 1234567890pqr 54897";
    StringBuilder myNumbers = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        if (Character.isDigit(str.charAt(i))) {
            myNumbers.append(str.charAt(i));
            System.out.println(str.charAt(i) + " is a digit.");
        } else {
            System.out.println(str.charAt(i) + " not a digit.");
        }
    }
    System.out.println("Your numbers: " + myNumbers.toString());
}

答案 3 :(得分:5)

您可以执行以下操作:

Matcher m = Pattern.compile("\\d+").matcher(str);
while (m.find()) {
   System.out.println(m.group(0));
}

答案 4 :(得分:2)

您可以使用str = str.replaceAll("replaced_string","replacing_string");

String str=" abc d 1234567890pqr 54897";
String str_rep1=" abc d ";
String str_rep2="pqr ";
String result1=str.replaceAll("", str_rep1);
String result2=str.replaceAll(",",str_rep2);

npinti建议也可以使用。

答案 5 :(得分:2)

使用java Scanner类的示例

import java.util.Scanner;

Scanner s = new Scanner( "abc d 1234567890pqr 54897" );
s.useDelimiter( "\\D+" );
while ( s.hasNextInt() ){
    s.nextInt(); // get int
}

答案 6 :(得分:2)

如果您不想使用正则表达式,

String str = " abc d 1234567890pqr 54897";

char[] chars = new char[str.length()];

int i = 0;
for (int j = 0; j < str.length(); j++) {
    char c = str.charAt(j);
    if (Character.isDigit(c)) {
        chars[i++] = c;
        if (j != chars.length - 1)
            continue;
    }
    if (chars[0] == '\0')
        continue;
    String num = new String(chars).trim();
    System.out.println(num);
    chars = new char[str.length()];
    i = 0;

}

输出: 1234567890 54897

答案 7 :(得分:2)

您要丢弃除数字和空格以外的所有内容:

String nums = input.replaceAll("[^0-9 ]", "").replaceAll(" +", " ").trim();

额外的电话会清理双倍和前导/尾随空格。

如果您需要数组,请添加拆分:

String[] nums = input.replaceAll("[^0-9 ]", "").trim().split(" +");

答案 8 :(得分:1)

您可以在空格上拆分字符串以获取各个条目,循环遍历它们,并尝试使用Integer / try方法在catch上使用相关方法解析它们处理解析它的情况是一个数字失败。这可能是最直接的方法。

或者,您可以构造一个正则表达式以仅匹配数字并使用它来查找所有数字。对于大字符串来说,这可能更具性能。正则表达式将看起来像<\ b> d + \ b' 。

更新:或者,如果这不是家庭作业或类似的(我假设您正在寻找自己实施它的线索,但这可能不是有效的),您可以使用@npinti提供的解决方案。这可能是您应该在生产代码中采用的方法。

答案 9 :(得分:1)

public static List<String> extractNumbers(String string) {
    List<String> numbers = new LinkedList<String>();
    char[] array = string.toCharArray();
    Stack<Character> stack = new Stack<Character>();

    for (int i = 0; i < array.length; i++) {
        if (Character.isDigit(array[i])) {
            stack.push(array[i]);
        } else if (!stack.isEmpty()) {
            String number = getStackContent(stack);
            stack.clear();
            numbers.add(number);
        }
    }
    if(!stack.isEmpty()){
        String number = getStackContent(stack);
        numbers.add(number);            
    }
    return numbers;
}

private static String getStackContent(Stack<Character> stack) {
    StringBuilder sb = new StringBuilder();
    Enumeration<Character> elements = stack.elements();
    while (elements.hasMoreElements()) {
        sb.append(elements.nextElement());
    }
    return sb.toString();
}

public static void main(String[] args) {
    String str = " abc d 1234567890pqr 54897";
    List<String> extractNumbers = extractNumbers(str);
    for (String number : extractNumbers) {
        System.out.println(number);
    }
}

答案 10 :(得分:1)

只需提取数字

String str=" abc d 1234567890pqr 54897";        

for(int i=0; i<str.length(); i++)
    if( str.charAt(i) > 47 && str.charAt(i) < 58)
        System.out.print(str.charAt(i));

另一个版本

String str=" abc d 1234567890pqr 54897";        
boolean flag = false;
for(int i=0; i<str.length(); i++)
    if( str.charAt(i) > 47 && str.charAt(i) < 58) {
        System.out.print(str.charAt(i));
        flag = true;
    } else {
        System.out.print( flag ? '\n' : "");
        flag = false;
    }

答案 11 :(得分:0)

public class ExtractNum

{

  public static void main(String args[])

  {

   String input = "abc d 1234567890pqr 54897";

   String digits = input.replaceAll("[^0-9.]","");

   System.out.println("\nGiven Number is :"+digits);

  }

 }

答案 12 :(得分:0)

courses1

通过上面的代码,您将获得所有数值。然后你可以合并它们或你想用这些数值做什么。

答案 13 :(得分:0)

 public static String convertBudgetStringToPriceInteger(String budget) {
    if (!AndroidUtils.isEmpty(budget) && !"0".equalsIgnoreCase(budget)) {
        double numbers = getNumericFromString(budget);
        if( budget.contains("Crore") ){
            numbers= numbers* 10000000;
        }else if(budget.contains("Lac")){
            numbers= numbers* 100000;
        }
        return removeTrailingZeroesFromDouble(numbers);
    }else{
        return "0";
    }
}

从字母数字字符串中获取数值

 public static double getNumericFromString(String string){
    try {
        if(!AndroidUtils.isEmpty(string)){
            String commaRemovedString = string.replaceAll(",","");
            return Double.parseDouble(commaRemovedString.replaceAll("[A-z]+$", ""));
            /*return Double.parseDouble(string.replaceAll("[^[0-9]+[.[0-9]]*]", "").trim());*/

        }
    }catch (NumberFormatException e){
        e.printStackTrace();
    }
    return 0;
}

例如。如果我通过1.5 lac或15,0000或15 Crores,那么我们可以从这些fucntion中获得数值。我们可以根据需要定制字符串。 例如。在1.5 Lac

的情况下,结果将是150000

答案 14 :(得分:0)

password

结果将为“ 1234567890 54897”。