【问题标题】:Java String remove all non numeric characters but keep the decimal separatorJava String 删除所有非数字字符但保留小数分隔符
【发布时间】:2012-05-09 12:20:04
【问题描述】:

尝试删除所有不是 0-9 和句点的字母和字符。我使用的是Character.isDigit(),但它也删除了小数点,我怎样才能保留小数点?

【问题讨论】:

  • [myStr = myStr.replaceAll( "[^\\d]", "" )][1] [1]: stackoverflow.com/questions/1533659/…
  • 这是一种奇怪的说法。 “所有不是 0-9 和句点的字母和字符”不等于更简单的“所有不是 0-9 和句点的字符”吗?我的意思是,字母是不是 0-9 也不是句点的字符。

标签: java string character decimal


【解决方案1】:

试试这个代码:

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

现在str 将包含"12.334.78"

【讨论】:

  • 这也可以:> str = str.replaceAll("[\\D.]", "");
  • @Óscar López:如何也包含负数?我的意思是,我必须用空格替换所有不是正数/负数的东西。该怎么做?
  • @PankajSinghal 只需在正则表达式中包含减号:[^\\d.-]
  • @yeaaaaahhhh..hamfhamf 不,这行不通。我们必须否定整个组(包括数字和点),您建议的代码只会否定数字,并且结果不会根据需要包含点。你测试了吗?使用上面的示例代码,您的代码返回 "1233478",这是不正确的。
  • 即使在 Android 中也能很好地工作。谢谢。
【解决方案2】:

我会使用正则表达式。

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

打印

2367.2723

对于负数,您可能还想保留 -

【讨论】:

  • 你不应该在你的正则表达式中转义点。
  • 您能否解释一下^. 在此声明中的含义?
  • @MansourFahad 在正则表达式中 [^ 表示不是这些字符,在 []. 只是 .
  • 既然. 只是a 并没有任何意义,我可以把它去掉吗?
  • @MansourFahad 仅当您希望结果中没有 .s 时。
【解决方案3】:

解决方案

带破折号

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

【讨论】:

  • 感谢您的精彩回答!!r
【解决方案4】:

用番石榴:

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

http://code.google.com/p/guava-libraries/wiki/StringsExplained

【讨论】:

  • @egorikem 如果您的项目已经在使用番石榴,您可以免费使用它..
【解决方案5】:
str = str.replaceAll("\\D+","");

【讨论】:

  • 不知道为什么人们不赞成您的解决方案...帮了我很多,谢谢!投票!
  • 谢谢 Zarial,我看到罗伯特实际上从 str = str.replaceAll("\D+",""); 编辑了我的答案到 str = str.replaceAll("\\D+",""); ...所以我在将它粘贴到 StackO 的编辑器框中时犯了这个错误。所以感谢罗伯特修复。现在可以了!
  • 它被否决了,因为它是一个转发。完全相同的答案已经在 5 年前被细分了!!见上图:stackoverflow.com/a/10372905/704246
  • @SaadBenbouzid 嗯?您对完全相同的答案的定义是什么?
  • @SaadBenbouzid 1) 是评论而不是答案 2) 是完全不同的正则表达式 3) 并非所有使用正则表达式 D 的答案都是相同的,就像指出所有使用 @987654323 的 C 语言答案一样@ 是重复的。此外,如果您在评论中看到答案,您可以要求 mod 将其转换为答案,甚至自己添加答案 - 在 StackOverlow 上不建议使用 cmets 中的答案。
【解决方案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();
}

【讨论】:

    【解决方案7】:

    货币小数点分隔符可以因区域设置而异。始终将. 视为分隔符可能很危险。 即

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

    我认为正确的方法是:

    • 默认通过DecimalFormatSymbols 获取十进制字符 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;
    }
    

    我希望这可能会有所帮助,'。

    【讨论】:

    • 虽然没有被问到,但这是唯一适用于本地化的解决方案。
    【解决方案8】:

    对于来到这里使用 Kotlin 的 Android 人

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

    输出:

    cleanString = "12345.67"
    

    然后可以安全地转换 toDouble()toFloat()toInt()(如果需要)

    【讨论】:

    • 或 Number ,在纯 Java 中。
    【解决方案9】:

    用 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.
    }
    

    【讨论】:

      【解决方案10】:

      这处理空输入、负数和小数(您需要在项目中包含 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-31
        • 2014-10-19
        • 1970-01-01
        • 2012-06-24
        • 2012-01-08
        • 1970-01-01
        • 2014-01-07
        • 2017-12-30
        相关资源
        最近更新 更多