Java字符串删除所有非数字字符


237

试图删除所有非0-9的字母和字符和一个句点。我正在使用,Character.isDigit()但它也会删除小数,如何还保留小数?


4
[myStr = myStr.replaceAll(“ [^ \\ d]”,“”)] [1] [1]:stackoverflow.com/questions/1533659/…–
位图

2
这是一个奇怪的说法。“所有非0-9且不包含句点的字母和字符”是否等同于更简单的“所有非0-9且不包含句点的字符”?我的意思是,字母是不是0-9也不是句点的字符。
亚当·扎克曼

Answers:


521

试试这个代码:

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

现在str将包含"12.334.78"


18
这也可能起作用:> str = str.replaceAll(“ [\\ D。]”,“”);
yeaaaahhhh..hamf hamf 2015年

1
@ÓscarLópez:如何也包括负数?我的意思是,我必须用空格替换所有非正数/负数的内容。怎么做?
Pankaj Singhal 2015年

3
@PankajSinghal只需在正则表达式的减号:[^\\d.-]
奥斯卡·洛佩斯

3
@ yeaaaahhhh..hamfhamf不行,不行。我们必须取整整个组(包括数字和点),您建议的代码仅取反数字,并且结果将不会按要求包括点。你测试了吗?使用上面的示例代码,您的代码返回"1233478",这是不正确的。
奥斯卡洛佩兹

即使在Android中也可以很好地工作。谢谢。
juanram0n

98

我会使用正则表达式。

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

版画

2367.2723

您可能还要保留-负数。


您不应该在正则表达式中转义该点。
亚当·扎尔克曼

能否请你放什么做了一些解释^,并.在此声明是什么意思?
曼苏尔·法哈德

1
@MansourFahad在正则表达式的[^方法,而不是这些字符和一个内[].只是.
彼得Lawrey

1
由于a .只是a a,并不代表任何意义,因此我可以摆脱它吗?
Mansour Fahad 2014年

@MansourFahad仅当您不希望.结果中包含s时。
methodsignature

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


感谢您的
宝贵回答


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

@SaadBenbouzid是吗?您对完全相同的答案的定义是什么?
鲍里斯·特鲁霍夫

2
@SaadBenbouzid 1)只是注释而不是答案2)是完全不同的正则表达式3)并非所有使用正则表达式D的答案都是相同的,这就像指出所有使用C语言的答案printf()都是重复的一样。另外,如果您看到注释中的答案,则可以要求mod将其转换为答案,甚至自己添加答案-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

用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通过默认的Locale或指定的Locale 获取十进制字符。
  • 用十进制字符烹饪正则表达式,以便仅获取数字

这里是我如何解决它:

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()如果需要的话


或Number,使用纯Java。
Alex Byrth


0

也许您会喜欢org.apache.commons.lang3.StringUtils.getDigits(str)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.