从Java中的字符串中提取数字

时间:2010-10-27 07:41:36

标签: java string

我有一个Java String对象。我只需从中提取数字。我举个例子:

"123-456-789"我想要"123456789"

是否有只提取数字的库函数?

感谢您的回答。在我尝试这些之前,我需要知道是否必须安装任何其他的llibraries?

14 个答案:

答案 0 :(得分:484)

您可以使用正则表达式并删除非数字。

str = str.replaceAll("\\D+","");

答案 1 :(得分:44)

这是一个更详细的解决方案。不太优雅,但可能更快:

public static String stripNonDigits(
            final CharSequence input /* inspired by seh's comment */){
    final StringBuilder sb = new StringBuilder(
            input.length() /* also inspired by seh's comment */);
    for(int i = 0; i < input.length(); i++){
        final char c = input.charAt(i);
        if(c > 47 && c < 58){
            sb.append(c);
        }
    }
    return sb.toString();
}

测试代码:

public static void main(final String[] args){
    final String input = "0-123-abc-456-xyz-789";
    final String result = stripNonDigits(input);
    System.out.println(result);
}

<强>输出:

  

0123456789

顺便说一句:我没有使用Character.isDigit(ch)因为它接受了除0 - 9之外的许多其他字符。

答案 2 :(得分:21)

public String extractDigits(String src) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < src.length(); i++) {
        char c = src.charAt(i);
        if (Character.isDigit(c)) {
            builder.append(c);
        }
    }
    return builder.toString();
}

答案 3 :(得分:19)

使用Google Guava:

CharMatcher.inRange('0','9').retainFrom("123-456-789")

<强>更新

使用Precomputed CharMatcher可以进一步提高效果

CharMatcher ASCII_DIGITS=CharMatcher.inRange('0','9').precomputed();  
ASCII_DIGITS.retainFrom("123-456-789");

答案 4 :(得分:14)

input.replaceAll("[^0-9?!\\.]","")

这将忽略小数点。

例如:如果输入为445.3kg,则输出为445.3

答案 5 :(得分:11)

使用Google Guava:

CharMatcher.DIGIT.retainFrom("123-456-789");

CharMatcher是可插拔的,使用起来非常有趣,例如,您可以执行以下操作:

String input = "My phone number is 123-456-789!";
String output = CharMatcher.is('-').or(CharMatcher.DIGIT).retainFrom(input);

输出== 123-456-789

答案 6 :(得分:6)

使用正则表达式来满足您的要求。

String num,num1,num2;
String str = "123-456-789";
String regex ="(\\d+)";
Matcher matcher = Pattern.compile( regex ).matcher( str);
while (matcher.find( ))
{
num = matcher.group();     
System.out.print(num);                 
}

答案 7 :(得分:4)

我受到了代码肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)的启发,并为了获得最佳性能而重写了它。

public static String stripNonDigitsV2( CharSequence input ) {
    if (input == null)
        return null;
    if ( input.length() == 0 )
        return "";

    char[] result = new char[input.length()];
    int cursor = 0;
    CharBuffer buffer = CharBuffer.wrap( input );

    while ( buffer.hasRemaining() ) {
        char chr = buffer.get();
        if ( chr > 47 && chr < 58 )
            result[cursor++] = chr;
    }

    return new String( result, 0, cursor );
}

我对非常​​长的字符串进行性能测试,编号最小,结果为:

  • 原始代码慢了25.5%
  • 番石榴方法慢2.5-3倍
  • D +的正则表达式慢3-3.5倍
  • 只有D的正则表达式慢25+倍

顺便说一句,这取决于该字符串的长度。对于仅包含6个数字的字符串,番石榴慢50%,正则表达速度慢1倍

答案 8 :(得分:3)

您可以使用str.replaceAll("[^0-9]", "");

答案 9 :(得分:3)

public class FindDigitFromString 
{

    public static void main(String[] args) 
    {
        String s="  Hi How Are You 11  ";        
        String s1=s.replaceAll("[^0-9]+", "");
        //*replacing all the value of string except digit by using "[^0-9]+" regex.*
       System.out.println(s1);          
   }
}

输出 11

答案 10 :(得分:2)

我已经完成了电话号码+9(987)124124的代码。

Unicode字符占用4个字节。

public static String stripNonDigitsV2( CharSequence input ) {
    if (input == null)
        return null;
    if ( input.length() == 0 )
        return "";

    char[] result = new char[input.length()];
    int cursor = 0;
    CharBuffer buffer = CharBuffer.wrap( input );
    int i=0;
    while ( i< buffer.length()  ) { //buffer.hasRemaining()
        char chr = buffer.get(i);
        if (chr=='u'){
            i=i+5;
            chr=buffer.get(i);
        }

        if ( chr > 39 && chr < 58 )
            result[cursor++] = chr;
        i=i+1;
    }

    return new String( result, 0, cursor );
}

答案 11 :(得分:2)

<强>代码:

public class saasa {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String t="123-456-789";
        t=t.replaceAll("-", "");
        System.out.println(t);
    }

答案 12 :(得分:0)

import java.util.*;
public class FindDigits{

 public static void main(String []args){
    FindDigits h=new  FindDigits();
    h.checkStringIsNumerical();
 }

 void checkStringIsNumerical(){
    String h="hello 123 for the rest of the 98475wt355";
     for(int i=0;i<h.length();i++)  {
      if(h.charAt(i)!=' '){
       System.out.println("Is this '"+h.charAt(i)+"' is a digit?:"+Character.isDigit(h.charAt(i)));
       }
    }
 }

void checkStringIsNumerical2(){
    String h="hello 123 for 2the rest of the 98475wt355";
     for(int i=0;i<h.length();i++)  {
         char chr=h.charAt(i);
      if(chr!=' '){
       if(Character.isDigit(chr)){
          System.out.print(chr) ;
       }
       }
    }
 }
}

答案 13 :(得分:0)

使用Kotlin和Lambda表达式,您可以这样做:

val digitStr = str.filter { it.isDigit() }