Chuỗi Java loại bỏ tất cả các ký tự không phải là số


237

Cố gắng xóa tất cả các chữ cái và ký tự không phải là 0-9 và một khoảng thời gian. Tôi đang sử dụng Character.isDigit()nhưng nó cũng loại bỏ số thập phân, làm thế nào tôi cũng có thể giữ số thập phân?


4
[mystr = myStr.replaceAll ( "[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/...
Bitmap

2
Đây là một cách kỳ lạ để nói điều này. Không phải "tất cả các chữ cái và ký tự không phải là 0-9 và một khoảng thời gian" tương đương với đơn giản hơn "tất cả các ký tự không phải là 0-9 và một dấu chấm"? Ý tôi là, các chữ cái là các ký tự không phải là 0-9 cũng không phải là dấu chấm.
Adam Zalcman

Câu trả lời:


521

Hãy thử mã này:

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

Bây giờ strsẽ chứa "12.334.78".


18
Điều này cũng có thể hoạt động:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf

1
@ Óscar López: làm thế nào để bao gồm cả số âm? Ý tôi là, tôi phải thay thế mọi thứ không phải là số dương / âm bằng một khoảng trống. Làm thế nào để làm điều đó?
Pankaj Singhal

3
@PankajSinghal chỉ đơn giản bao gồm dấu trừ trong biểu thức chính quy:[^\\d.-]
Óscar López

3
@ yeaaaahhhh..hamfhamf không, điều đó sẽ không hiệu quả. Chúng tôi phải phủ định toàn bộ nhóm (bao gồm số và dấu chấm), mã được đề xuất của bạn chỉ phủ định các số và kết quả sẽ không bao gồm các dấu chấm, theo yêu cầu. Bạn đã kiểm tra nó? sử dụng mã mẫu ở trên, mã của bạn trả về "1233478", không chính xác.
Óscar López

Hoạt động rất tốt ngay cả trong Android. Cảm ơn.
juanram0n

98

Tôi sẽ sử dụng một regex.

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

in

2367.2723

Bạn có thể muốn giữ -tốt cho các số âm.


Bạn không nên thoát khỏi dấu chấm trong regrec của bạn.
Adam Zalcman

Bạn có thể vui lòng đặt một số lời giải thích cho những gì không ^.có nghĩa trong tuyên bố này?
Mansour Fahad

1
@MansourFahad Trong một regex [^phương tiện không những nhân vật này và bên trong một []một .chỉ là một.
Peter Lawrey

1
Vì a .chỉ là một avà không có nghĩa gì cả, tôi có thể thoát khỏi nó không?
Mansour Fahad

@MansourFahad chỉ khi bạn không muốn có .kết quả.
phương pháp ký hiệu

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

kết quả: 0097-557890-999

nếu bạn cũng không cần "-" trong Chuỗi, bạn có thể làm như thế này:

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

kết quả: 0097557890999


Cảm ơn câu trả lời tuyệt vời !! r
shridutt kothari


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

Tại sao mọi người lại đánh giá thấp giải pháp của bạn ... Đã giúp tôi rất nhiều, cảm ơn! Bỏ phiếu lên!
Zarial

Cảm ơn Zarial, tôi thấy Robert thực sự đã chỉnh sửa câu trả lời của tôi từ str = str.replaceAll ("\ D +", ""); to str = str.replace ALL ("\\ D +", ""); ... Vì vậy, tôi đã mắc lỗi này khi dán nó vào hộp soạn thảo của StackO. Vì vậy, cảm ơn bạn Robert đã sửa chữa. Bây giờ nó hoạt động!
Angoranator777

nó bị hạ thấp vì nó là một repost. Câu trả lời chính xác đã được đăng ký 5 năm trước !! xem ở trên: stackoverflow.com/a/10372905/704246
Saad Benbouzid

@SaadBenbouzid hả? định nghĩa của bạn về cùng một câu trả lời là gì?
Boris Treukhov

2
@SaadBenbouzid 1) đó là bình luận và không phải là một câu trả lời 2) đó là một regex hoàn toàn khác nhau 3) không phải tất cả những câu trả lời mà sử dụng regex D là giống hệt nó giống như chỉ rằng tất cả các câu trả lời bằng ngôn ngữ C mà sử dụng printf()là bản sao. Ngoài ra nếu bạn thấy câu trả lời trong bình luận, bạn có thể yêu cầu mod chuyển đổi nó thành câu trả lời hoặc thậm chí tự thêm câu trả lời - câu trả lời trong các bình luận không được khuyến khích trên StackOverlow.
Boris Treukhov

6

Cách đơn giản mà không cần sử dụng Regex:

Thêm một kiểm tra ký tự bổ sung cho dấu chấm '.'sẽ giải quyết yêu cầu:

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

Một cách để thay thế nó bằng một luồng 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

Dấu tách thập phân tiền tệ có thể khác nhau từ Địa điểm khác. Nó có thể nguy hiểm để coi .như là dải phân cách luôn. I E

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

Tôi nghĩ rằng cách thích hợp là:

  • Nhận ký tự thập phân qua DecimalFormatSymbolsLocale mặc định hoặc một ký tự được chỉ định.
  • Nấu mẫu biểu thức chính quy với ký tự thập phân để chỉ lấy các chữ số

Và đây là cách tôi giải quyết nó:

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

mã:

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

Tôi hy vọng điều đó có thể giúp đỡ, '.


3

Dành cho những người dùng Android đến đây cho Kotlin

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

Đầu ra:

cleanString = "12345.67"

Điều này sau đó có thể được chuyển đổi một cách an toàn toDouble(), toFloat()hoặc toInt()nếu cần


Hoặc Số, trong Java thuần túy.
Alex Byrth

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.