Java 문자열은 숫자가 아닌 모든 문자를 제거합니다


237

0-9가 아닌 모든 문자와 문자를 제거하려고합니다. 나는 사용하고 Character.isDigit()있지만 소수점도 제거합니다. 소수도 어떻게 유지할 수 있습니까?


4
[myStr = myStr.replaceAll ( "[^ \\ d]", "")] [1] [1] : stackoverflow.com/questions/1533659/…
비트 맵

2
이것은 이것을 말하는 이상한 방법입니다. "0-9와 마침표가 아닌 모든 문자와 문자"가 단순한 "0-9와 마침표가 아닌 모든 문자"와 동등하지 않습니까? 문자는 0-9가 아닌 문자입니다.
Adam Zalcman

답변:


521

이 코드를 사용해보십시오 :

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

이제 str가 포함 "12.334.78"됩니다.


18
이것은 또한 작동 할 수 있습니다 :> str = str.replaceAll ( "[\\ D.]", "");
yeaaaahhhh..hamf hamf

1
@ Óscar López : 음수를 포함하는 방법? 양수 / 음수가 아닌 모든 것을 빈 공간으로 바꿔야한다는 뜻입니다. 그렇게하는 방법?
Pankaj Singhal

3
@PankajSinghal은 간단히 정규식에 빼기 부호를 포함시킵니다.[^\\d.-]
Óscar López

3
@ yeaaaahhhh..hamfhamf 아니, 그건 작동하지 않습니다. 우리는 전체 그룹 (숫자와 점 포함)을 무효화해야하며 제안 된 코드는 숫자 만 무효화하며 필요한 경우 점이 포함되지 않습니다. 테스트 했습니까 ? 위의 샘플 코드를 사용하면 코드가을 반환합니다 "1233478".
Óscar López

안드로이드에서도 잘 작동합니다. 감사.
juanram0n 2016 년

98

정규식을 사용합니다.

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

인쇄물

2367.2723

-음수도 유지 하고 싶을 수도 있습니다 .


정규 표현식에서 점을 벗어나면 안됩니다.
Adam Zalcman

이 진술의 의미 ^.의미에 대해 설명해 주 시겠습니까?
Mansour Fahad

1
정규식에서 @MansourFahad [^이러한 문자하지 수단과 내부 []a는 .단지입니다.
피터 Lawrey

1
a .는 단지 a의미 가 있고 아무 의미가 없으므로 제거 할 수 있습니까?
Mansour Fahad

@MansourFahad .는 결과에 s 를 원하지 않는 경우에만 가능합니다 .
methodsignature

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


위대한
답변에


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

Dunno 사람들이 왜 솔루션을 다운 다운했는지 ... 저를 도와주었습니다. 감사합니다! 투표하다!
Zarial

Zarial에게 감사드립니다. Robert가 실제로 str = str.replaceAll ( "\ D +", "")에서 내 답변을 편집 한 것을 볼 수 있습니다. ~ str = str.replaceAll ( "\\ D +", ""); ... 그래서 StackO의 편집기 상자에 붙여 넣을 때이 실수를 범했습니다. 로버트에게 고맙습니다. 이제 작동합니다!
Angoranator777

다운 포스트이므로 다시 게시됩니다. 정확히 같은 답변이 5 년 전에 이미 대체되었습니다! 위 참조 : stackoverflow.com/a/10372905/704246
Saad Benbouzid

트윗 담아 가기 정확히 같은 대답에 대한 당신의 정의는 무엇입니까?
보리스 Treukhov

2
@SaadBenbouzid 1) 설명이 아닌 대답 2) 완전히 다른 정규식 3) 정규식 D를 사용하는 모든 답변이 동일하지는 않습니다. 사용하는 모든 C 언어 답변 printf()이 중복 임을 가리키는 것과 같습니다 . 또한 의견에 답변이 표시되면 mod에게 답변으로 변환하거나 직접 답변을 추가하도록 요청할 수 있습니다-의견에 대한 답변은 StackOverlow에서 권장되지 않습니다.
Boris Treukhov

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

Java 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기본 로케일 또는 지정된 하나 를 통해 10 진수 문자를 가져 옵니다.
  • 숫자 만 얻기 위해 십진수 문자로 정규식 패턴을 요리하십시오.

그리고 여기 내가 어떻게 해결하고 있습니까?

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

Kotlin을 위해 여기에 오는 Android 사람들을 위해

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

산출:

cleanString = "12345.67"

이 후 안전하게 변환 할 수 있습니다 toDouble(), toFloat()또는 toInt()경우에 필요


순수한 Java에서 또는 Number.
Alex Byrth

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.