Java String ลบอักขระที่ไม่ใช่ตัวเลขทั้งหมด


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
@ ÓscarLópez: จะรวมจำนวนลบได้อย่างไร ฉันหมายถึงฉันต้องแทนที่ทุกอย่างที่ไม่ใช่จำนวนบวก / ลบด้วยช่องว่าง ทำอย่างไร
Pankaj Singhal

3
@PankajSinghal เพียงรวมเครื่องหมายลบใน regex:[^\\d.-]
ÓscarLópez

3
@ yeaaaahhhh..hamfhamf ไม่นั่นไม่ได้ผล เราต้องคัดค้านทั้งกลุ่ม (รวมถึงตัวเลขและจุด) โค้ดที่คุณแนะนำจะลบล้างตัวเลขเท่านั้นและผลลัพธ์จะไม่รวมจุดตามที่ต้องการ คุณทดสอบหรือไม่ เมื่อใช้รหัสตัวอย่างด้านบนรหัสของคุณจะส่งคืน"1233478"ซึ่งไม่ถูกต้อง
ÓscarLópez

ทำงานได้ดีแม้ใน Android ขอบคุณ
juanram0n

98

ฉันจะใช้ regex

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

พิมพ์

2367.2723

คุณอาจต้องการเก็บไว้-สำหรับตัวเลขลบ


คุณไม่ควรหลีกเลี่ยงจุดใน regexp ของคุณ
Adam Zalcman

คุณช่วยอธิบายอะไรเกี่ยวกับความหมาย^และความ.หมายของคำนี้ได้บ้าง?
Mansour Fahad

1
@MansourFahad ใน regex [^ไม่ได้หมายความว่าตัวละครเหล่านี้และภายใน[]a .เป็นเพียง.
Peter Lawrey

1
เนื่องจาก a .เป็นเพียงaและไม่ได้มีความหมายอะไรเลยฉันสามารถกำจัดมันได้หรือไม่?
Mansour Fahad

@ MansourFahad เฉพาะในกรณีที่คุณไม่ต้องการ.ผลลัพธ์
ระเบียบวิธีลงนาม

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

ผลลัพธ์: 0097-557890-999

ถ้าคุณไม่ต้องการ "-" ใน String คุณสามารถทำสิ่งนี้ได้:

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

ผลลัพธ์: 0097557890999


ขอบคุณสำหรับคำตอบที่ดี !! 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-l ไลบรารี/wiki/StringsExplained


1
ทำไมในโลกที่คุณต้องการ Guava สำหรับงานที่ง่ายและจำเป็น!
egorikem

@egorikem ถ้าโครงการของคุณอยู่แล้วโดยใช้ฝรั่งคุณสามารถใช้มันไม่มีค่าใช้จ่ายพิเศษ ..
สแตน

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

Dunno ทำไมผู้คนถึงลงคะแนนโซลูชันของคุณ ... ช่วยฉันได้มากขอบคุณ! โหวตขึ้น!
Zarial

ขอบคุณ Zarial ฉันเห็น Robert แก้ไขคำตอบของฉันจาก str = str.replaceAll ("\ D +", "") จริง ๆ ; เพื่อ str = str.replaceAll ("\\ D +", ""); ... ดังนั้นฉันจึงทำผิดพลาดนี้เมื่อวางลงในกล่องแก้ไขกองซ้อนของ StackO ขอบคุณโรเบิร์ตที่ได้แก้ไข ตอนนี้มันใช้งานได้!
Angoranator777

มันลดลงเพราะเป็น repost คำตอบเดียวกันถูกต้องแล้ว sublitted 5 ปีที่ผ่านมา !! ดูด้านบน: stackoverflow.com/a/10372905/704246
Saad Benbouzid

@SaadBenbouzid ฮะเหรอ? ความหมายของคำตอบเดียวกันที่แน่นอนคืออะไร?
Boris Treukhov

2
@SadadBenbouzid 1) นั่นคือความคิดเห็นและไม่ใช่คำตอบ 2) นั่นคือ regex ที่แตกต่างกันโดยสิ้นเชิง 3) ไม่ใช่คำตอบทั้งหมดที่ใช้ regex D เหมือนกันมันเหมือนกับชี้ให้เห็นว่าคำตอบทั้งหมดของภาษา C ที่ใช้printf()ซ้ำกัน นอกจากนี้หากคุณเห็นคำตอบในความคิดเห็นคุณสามารถขอให้ mod แปลงเป็นคำตอบหรือเพิ่มคำตอบด้วยตัวคุณเอง - คำตอบในความคิดเห็นนั้นไม่ได้รับการสนับสนุนใน StackOverlow
Boris Treukhov

6

วิธีง่ายๆโดยไม่ใช้ Regex:

การเพิ่มการตรวจสอบอักขระพิเศษสำหรับจุด'.'จะแก้ปัญหาความต้องการ:

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

ตัวคั่นทศนิยมสกุลเงินอาจแตกต่างจาก Locale ไปยังอีก อาจเป็นอันตรายได้หากพิจารณา.เป็นตัวคั่นเสมอ กล่าวคือ

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

ฉันคิดว่าวิธีที่เหมาะสมคือ:

  • รับตัวละครทศนิยมผ่านทางDecimalFormatSymbolsสถานที่เริ่มต้นหรือหนึ่งที่ระบุ
  • ปรุงรูปแบบ regex ด้วยอักขระทศนิยมเพื่อให้ได้ตัวเลขเท่านั้น

และนี่คือวิธีที่ฉันจะแก้มัน:

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 ที่มาที่นี่เพื่อ Kotlin

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

เอาท์พุท:

cleanString = "12345.67"

นี้จากนั้นจะสามารถแปลงได้อย่างปลอดภัยtoDouble(), toFloat()หรือtoInt()ถ้าจำเป็น


หรือ Number ใน pure Java
Alex Byrth

1

สิ่งนี้จะจัดการอินพุตที่ไม่มีค่าเป็นตัวเลขลบและทศนิยม (คุณต้องรวมไลบรารี Apache Commons Lang เวอร์ชัน 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.