जावा स्ट्रिंग सभी गैर-संख्यात्मक वर्णों को हटा दें


237

0-9 और एक अवधि के सभी अक्षरों और वर्णों को हटाने की कोशिश करना। मैं उपयोग कर रहा हूं, Character.isDigit()लेकिन यह दशमलव भी निकालता है, मैं दशमलव को कैसे रख सकता हूं?


4
[myStr = myStr.replaceAll ("[^ \\ d]", "")]] [1] [१]: stackoverflow.com/questions/1533659/…
बिटमैप

2
यह कहने का यह एक अजीब तरीका है। "सभी वर्ण और वर्ण जो 0-9 नहीं हैं और एक अवधि" सरल "के बराबर है" सभी वर्ण जो 0-9 और एक अवधि नहीं हैं "? मेरा मतलब है, अक्षर ऐसे अक्षर हैं जो 0-9 नहीं हैं और न ही अवधि।
एडम ज़ल्कमैन

जवाबों:


521

इस कोड को आज़माएं:

String str = "a12.334tyz.78x";
str = str.replaceAll("[^\\d.]", "");

अब strहोगा "12.334.78"


18
यह भी काम कर सकता है:> str = str.replaceAll ("[\\ D।]", "");
येअहहहह..हमफ हम्फ

1
@ Negativescar López: नकारात्मक संख्याओं को भी कैसे शामिल करें? मेरा मतलब है, मुझे उन सभी चीजों को बदलना होगा जो एक खाली जगह के साथ सकारात्मक / नकारात्मक संख्या नहीं है। उसको कैसे करे?
पंकज सिंघल

3
@ पंकजसिंघल ने बस रेगेक्स में माइनस साइन को शामिल किया:[^\\d.-]
Lscar López

3
@ yeaaaahhhh..hamfhamf नहीं, यह काम नहीं करेगा। हमें पूरे समूह (संख्याओं और बिंदुओं सहित) को नकारना होगा, आपके सुझाए गए कोड केवल संख्याओं की उपेक्षा करते हैं, और परिणाम में डॉट्स शामिल नहीं होंगे, जैसा कि आवश्यक है। क्या आपने इसका परीक्षण किया? ऊपर दिए गए नमूना कोड का उपयोग करके, आपका कोड वापस आ जाता है "1233478", जो गलत है।
सकर लोपेज

Android में भी बहुत अच्छी तरह से काम करता है। धन्यवाद।
juanram0n

98

मैं एक regex का उपयोग करेगा।

String text = "-jaskdh2367sd.27askjdfh23";
String digits = text.replaceAll("[^0-9.]", "");
System.out.println(digits);

प्रिंट

2367.2723

आप -नकारात्मक संख्या के लिए भी रखना पसंद कर सकते हैं ।


आपको अपने regexp में डॉट से बचना नहीं चाहिए।
एडम ज़ल्कमैन

आप क्या करता है के लिए कुछ स्पष्टीकरण डाल कृपया सकते हैं ^और .इस बयान में मतलब?
मंसूर फहद

1
एक regex में @MansourFahad [^इन पात्रों अर्थ है और नहीं एक के अंदर []एक .सिर्फ एक है.
पीटर Lawrey

1
चूँकि a .सिर्फ एक है aऔर इसका कोई मतलब नहीं है, क्या मैं इससे छुटकारा पा सकता हूँ?
मंसूर फहद

@MansourFahad केवल अगर आप .अपने परिणाम में कोई एस नहीं चाहते हैं ।
कार्यप्रणाली

44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

परिणाम: 0097-557890-999

अगर आपको भी "-" की आवश्यकता नहीं है, तो स्ट्रिंग में आप ऐसा कर सकते हैं:

String phoneNumberstr = "Tel: 00971-55 7890 999";      
String numberRefined = phoneNumberstr.replaceAll("[^0-9]", "");

परिणाम: 0097557890999


महान answe के लिए धन्यवाद !! r
shridutt kothari

20

अमरूद के साथ:

String input = "abx123.5";
String result = CharMatcher.inRange('0', '9').or(CharMatcher.is('.')).retainFrom(input);

http://code.google.com/p/guava-lbooks/wiki/StringsExplained देखें


1
क्यों दुनिया में आपको इतने आसान और आवश्यक कार्य के लिए अमरूद की आवश्यकता होगी ?!
इगोरिकम

@egorikem यदि आपकी परियोजना पहले से ही अमरूद का उपयोग कर रही है, तो आप इसे बिना किसी अतिरिक्त लागत के उपयोग कर सकते हैं ..
stan

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

डन्नो लोगों ने आपके समाधान को क्यों नकार दिया ... मेरी मदद की, धन्यवाद! वोट देता है!
जरील

धन्यवाद जरायल, मुझे लगता है कि रॉबर्ट ने वास्तव में str = str.replaceAll ("\ D +", "") से अपना उत्तर संपादित किया है; to str = str.replaceAll ("\\ D +", ""); ... तो मैंने यह गलती स्टैको के संपादक बॉक्स चीज़ में पेस्ट करते समय की। तो फिक्सिंग के लिए रॉबर्ट का शुक्रिया। अब यह काम कर रहा है!
अंगोरानेंट777

यह एक repost है क्योंकि यह अस्वीकृत है। सटीक एक ही जवाब 5 साल पहले ही वशीभूत हो चुका है !! ऊपर देखें: stackoverflow.com/a/10372905/704246
Saad Benbouzid

@ सादबेनबौजिद हुह? ठीक उसी उत्तर की आपकी परिभाषा क्या है?
बोरिस ट्रेखोव

2
@SaadBenbouzid 1) यह टिप्पणी है और एक उत्तर नहीं 2) कि एक पूरी तरह से अलग rexx 3 है) सभी जवाब जो रेगेक्स डी का उपयोग नहीं करते हैं, यह समान हैं यह इंगित करने जैसा है कि सभी सी भाषा के उत्तर जो printf()डुप्लिकेट हैं। यदि आप टिप्पणी में उत्तर देखते हैं, तो आप इसे एक उत्तर में बदलने के लिए मॉड पूछ सकते हैं या यहां तक ​​कि अपने दम पर एक उत्तर भी जोड़ सकते हैं - टिप्पणियों में उत्तर StackOverlow पर हतोत्साहित किए जाते हैं।
बोरिस ट्रेखोव

6

रेगेक्स का उपयोग किए बिना सरल तरीका:

डॉट के लिए एक अतिरिक्त वर्ण जांच जोड़ने '.'से आवश्यकता का समाधान होगा:

public static String getOnlyNumerics(String str) {
    if (str == null) {
        return null;
    }
    StringBuffer strBuff = new StringBuffer();
    char c;
    for (int i = 0; i < str.length() ; i++) {
        c = str.charAt(i);
        if (Character.isDigit(c) || c == '.') {
            strBuff.append(c);
        }
    }
    return strBuff.toString();
}

3

इसे जावा 8 स्ट्रीम से बदलने का एक तरीका:

public static void main(String[] args) throws IOException
{
    String test = "ab19198zxncvl1308j10923.";
    StringBuilder result = new StringBuilder();

    test.chars().mapToObj( i-> (char)i ).filter( c -> Character.isDigit(c) || c == '.' ).forEach( c -> result.append(c) );

    System.out.println( result ); //returns 19198.130810923.
}

3

मुद्रा दशमलव विभाजक लोकेल से दूसरे में भिन्न हो सकता है। .हमेशा विभाजक के रूप में विचार करना खतरनाक हो सकता है । अर्थात

╔════════════════╦═══════════════════╗
    Currency          Sample       
╠════════════════╬═══════════════════╣
 USA             $1,222,333.44 USD 
 United Kingdom  £1.222.333,44 GBP 
 European        1.333.333,44 EUR 
╚════════════════╩═══════════════════╝

मुझे लगता है कि उचित तरीका है:

  • DecimalFormatSymbolsडिफ़ॉल्ट स्थान या निर्दिष्ट एक के माध्यम से दशमलव चरित्र प्राप्त करें ।
  • केवल अंकों को प्राप्त करने के लिए दशमलव वर्ण के साथ रेगेक्स पैटर्न कुक

और यहाँ मैं इसे कैसे हल कर रहा हूँ:

import java.text.DecimalFormatSymbols;
import java.util.Locale;

कोड:

    public static String getDigit(String quote, Locale locale) {
    char decimalSeparator;
    if (locale == null) {
        decimalSeparator = new DecimalFormatSymbols().getDecimalSeparator();
    } else {
        decimalSeparator = new DecimalFormatSymbols(locale).getDecimalSeparator();
    }

    String regex = "[^0-9" + decimalSeparator + "]";
    String valueOnlyDigit = quote.replaceAll(regex, "");
    try {
        return valueOnlyDigit;
    } catch (ArithmeticException | NumberFormatException e) {
        Log.e(TAG, "Error in getMoneyAsDecimal", e);
        return null;
    }
    return null;
}

मुझे उम्मीद है कि मदद मिल सकती है। '


3

कोटलिन के लिए यहां आने वाले Android लोगों के लिए

val dirtyString = "💰 Account Balance: $-12,345.67"
val cleanString = dirtyString.replace("[^\\d.]".toRegex(), "")

आउटपुट:

cleanString = "12345.67"

यह तब सुरक्षित रूप से परिवर्तित किया जा सकता है toDouble(), toFloat()या toInt()यदि आवश्यक हो


या संख्या, शुद्ध जावा में।
एलेक्स बर्थ

1

यह आपके प्रोजेक्ट में अशक्त इनपुट, नकारात्मक संख्या और दशमलव (आपको अपाचे कॉमन्स लैंग लाइब्रेरी, संस्करण 3.8 या उच्चतर को शामिल करने की आवश्यकता है) को संभालता है:

import org.apache.commons.lang3.RegExUtils;
result = RegExUtils.removeAll(input, "-?[^\\d.]");

पुस्तकालय संदर्भ: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RegExUtils.html


0

शायद आप पसंद करेंगे। org.apache.commons.lang3.StringUtils.getDigits (str)

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