जावा में एक स्ट्रिंग से अंक निकालें


207

मेरे पास एक जावा Stringऑब्जेक्ट है। मुझे इसमें से केवल अंक निकालने की जरूरत है। मैं एक उदाहरण दूंगा:

"123-456-789" मुझे चाहिए "123456789"

क्या कोई लाइब्रेरी फ़ंक्शन है जो केवल अंक निकालता है?

जवाब के लिए धन्यवाद। इससे पहले कि मैं ये कोशिश करूं कि मुझे यह जानने की जरूरत है कि क्या मुझे कोई अतिरिक्त लाइब्रेरी स्थापित करनी है?

जवाबों:


545

आप regex का उपयोग कर सकते हैं और गैर-अंकों को हटा सकते हैं।

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

6
अच्छा लघु कोड। एक रेखीय खोज अधिक तेज़ हो सकती है लेकिन मुझे लगता है कि आपका अर्थ अधिक समझ में आता है।
कास्टेन

18
मुझे लगता है कि आप किसी भी चीज को डाउनवोट करना पसंद कर सकते हैं (कोई व्यंग्य नहीं है)। लेकिन मेरी व्यक्तिगत राय है: जब महान डेवलपर्स (और हमारे पास उनमें से बहुत सारे हैं) अपनी कुछ सलाह मुफ्त में साझा करते हैं, तो मैं यह सम्मान करने जा रहा हूं, और मैं केवल सामान को कम कर रहा हूं जो वास्तव में भयानक है (मेरी प्रोफ़ाइल की जांच करें, मेरा वर्तमान अनुपात 17xx के मुकाबले 14xx है)। लेकिन यह मेरा व्यक्तिगत दर्शन है और आप अपने स्वयं के लिए स्वतंत्र हैं।
शॉन पैट्रिक फ्लोयड

78
यह अभ्यस्त कार्य यदि आपके नंबर में दशमलव बिंदु है, तो यह दशमलव बिंदु को भी हटा देता है। str = str.replaceAll("[^\\.0123456789]","");
अरविंदन आर

2
यद्यपि रेगेक्स देखने में बेहद सरल और साफ है, यह प्रदर्शन के मुद्दों से ग्रस्त है और इसका उपयोग केवल वहीं किया जाना चाहिए जहां आपके पास एक-ऑफ स्ट्रिप (जैसे फॉर्म सबमिट) है। यदि आप बहुत अधिक डेटा संसाधित कर रहे हैं, तो यह जाने का तरीका नहीं है।
ब्रिल पप्पिन

2
और अगर आपको दशमलव बिंदु की तरह कुछ भी बाहर करने की आवश्यकता है,(?!\\.)
azerafati

49

यहाँ एक और अधिक क्रिया समाधान है। कम सुरुचिपूर्ण, लेकिन शायद तेज:

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

BTW: मैंने Character.isDigit (ch) का उपयोग नहीं किया क्योंकि यह 0 - 9 को छोड़कर कई अन्य वर्णों को स्वीकार करता है।


4
आपको यह सुनिश्चित करने के लिए कि इसे पुनः लोड करने की आवश्यकता नहीं है , आपको StringBuilderकंस्ट्रक्टर (जैसे कि input.length()) को एक आकार प्रदान करना चाहिए । आपको Stringयहां मांग करने की आवश्यकता नहीं है; CharSequenceपर्याप्त होता। इसके अलावा, आप StringBuilderगैर-अंकों के संग्रह से आवंटन को एक अलग फ़ंक्शन लिखकर अलग कर सकते हैं जो एक आउटपुट के CharSequenceरूप में इनपुट और Appendableउदाहरण के रूप में स्वीकार करता है ।
सेह

1
@seh दिलचस्प लगता है, लेकिन टिप्पणी करने के बजाय एक्सटेंशन के साथ अपना जवाब क्यों नहीं बनाते हैं?
RedYeti

3
@RedYeti इस उत्तर को रहने देना और टिप्पणी जोड़ना अधिक सम्मानजनक है क्योंकि शॉन को तब तक प्राप्त होता है। यदि आप जल्दी में हैं, तो इसे दोबारा लिखने की तुलना में दूसरों के कोड की आलोचना करना बहुत जल्दी है। मूल्यवान योगदान करने के लिए सेह को दंडित न करें, उसे उन उपयोगी tidbits को जोड़ना नहीं था, और आपकी प्रतिक्रिया से उसे अगली बार ऐसा करने की संभावना कम हो जाती है।
कोमोडोडेव

2
मैं किसी को "दंडित" नहीं कर रहा हूं - यह पूरी गलत व्याख्या है कि मैं @ सेह से क्या कह रहा था। मेरा कहना यह था कि उनकी टिप्पणियों में बहुत कुछ जोड़ा गया था जो सार्थक था और वास्तव में इतना बदल गया कि मुझे लगा कि यह स्वयं का एक उत्तर देता है। मुझे यकीन है कि सीन पैट्रिक फ्लोयड केवल दूसरों की मदद करने वाले कुडोस से चिंतित नहीं है और सेह को अपना जवाब देने में पूरी तरह से खुश होगा। मैं केवल सेह को प्रोत्साहित कर रहा था क्योंकि मुझे लगा कि उनका योगदान अधिक से अधिक दृश्यता के योग्य है। मेरी टिप्पणी को किसी और चीज़ के साथ पढ़ना पूरी तरह से कैसे संभव है, लेकिन मैं इसे किसी तरह से सेह करने के लिए माफी माँगता हूँ।
RedYeti

1
मुझे पसंद है कि थोड़ी देर के लिए निष्क्रिय होने के बाद ये चर्चाएं कैसे उठती हैं। शायद यहाँ सबसे अच्छी बात यह है कि मेरे लिए शॉन के उत्तर को संपादित करना, अपने सुझावों के साथ इसे बढ़ाना। इस तरह, शॉन को क्रेडिट प्राप्त करना जारी रहेगा जब तक कि सामुदायिक विकी स्थिति के लिए उत्तर संक्रमण नहीं होगा।
सेह

22
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();
}

मैंने खुद Character.isDigit () का उपयोग करने के बारे में सोचा, लेकिन यह कुछ ऐसे पात्रों को भी स्वीकार करता है जो 0-9 नहीं हैं (डॉक्स देखें: download.oracle.com/javase/6/docs/api/java/lang/… )
सीन पैट्रिक फ्लोयड

21

Google अमरूद का उपयोग:

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

अपडेट करें:

Precomputed CharMatcher का उपयोग प्रदर्शन को और बेहतर कर सकता है

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

3
अब Charmatcher.DIGITपूर्वनिर्धारित है।
डंकन मैकग्रेगर

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

यह दशमलव बिंदुओं की अनदेखी करेगा।

उदाहरण: यदि आपके पास एक इनपुट है जैसा 445.3kgकि आउटपुट होगा 445.3


मेरे पास "4.5 zi" है। काम नहीं कर रहा है क्योंकि यह दूसरा रहता है। भी
मैरिएन Klüspspies

11

Google अमरूद का उपयोग:

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


बहुत अच्छा समाधान (+1), लेकिन यह दूसरों की तरह ही समस्या से ग्रस्त है: बहुत सारे पात्र यूनिकोड अंकों के रूप में अर्हता प्राप्त करते हैं, न कि केवल आस्की अंक। यह कोड इन सभी वर्णों को बनाए रखेगा: unicode.org/cldr/utility/list-unicodeset.jsp?a=%5Cp%7Bdigit%7D
सीन पैट्रिक फ्लोयड

@seanizer: तो फिर इस बेहतर होगा CharMatcher.inRange ( '1', '9') retainFrom ( "123-456-789")।
एमिल

@ और अधिक पसंद करें CharMatcher.inRange ('0', '9'), लेकिन: हाँ
सीन पैट्रिक फ्लोयड

InRange चारमरैचर के पीछे स्थित है। pastie.org/1252471 यह बस ध्यान में आता है UTF नंबर पर्वतमाला, मैं अभी भी इन्हें अंकों के रूप में मानूंगा, क्योंकि वास्तव में वे हैं, वे बस ASCII एन्कोडेड नहीं हैं।
ब्योर्नस

आप इसी उद्देश्य के लिए चारमैचर.जवा_डिगिट का भी उपयोग कर सकते हैं, जो कि केवल कैरेक्टर के अनुसार अंकों को स्वीकार करेगा।
डिजिट

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);                 
}

5

मैं कोड सीन पैट्रिक फ्लोयड से प्रेरित था और इसे अधिकतम प्रदर्शन के लिए थोड़ा फिर से लिखता हूं।

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 गुना धीमी है
  • केवल डी के साथ नियमित अभिव्यक्ति 25+ बार धीमी है

Btw यह निर्भर करता है कि स्ट्रिंग कितनी लंबी है। स्ट्रिंग के साथ जिसमें केवल 6 नंबर होता है, अमरूद 50% धीमा और रेगेक्सप 1 गुना धीमा होता है


4
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



2

मैंने फोन नंबर +9 (987) 124124 के लिए कोड को अंतिम रूप दिया है।

यूनिकोड वर्ण में 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 );
}


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) ;
       }
       }
    }
 }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.