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, ни точкой.
Адам Зальцман,

Ответы:

521

Попробуйте этот код:

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

Теперь strбудет содержать "12.334.78".

Оскар Лопес
источник
18
Это также может работать:> str = str.replaceAll ("[\\ D.]", "");
даааааааа ... хамф хамф
1
@ Оскар Лопес: как включить отрицательные числа также? Я имею в виду, я должен заменить все, что не является положительным / отрицательным числом, пустым пробелом. Как это сделать?
Панкадж Сингхал
3
@PankajSinghal просто включите знак минус в регулярное выражение:[^\\d.-]
Оскар Лопес
3
@ дааааахххх..хамфхамф нет, это не сработает. Мы должны свести на нет всю группу (включая цифры и точки), предложенный вами код только отрицает цифры, и результат не будет включать точки, как требуется. Вы проверяли это? используя приведенный выше пример кода, ваш код возвращается "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и ничего не значит, я могу просто избавиться от этого?
Мансур Фахад
@MansourFahad, только если вы не хотите, чтобы .s в вашем результате.
методика подписи
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

Faakhir
источник
Спасибо за великий ответ !! r
Шридутт Котари
20

С гуавой:

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

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

Керем Байдоган
источник
1
Зачем в мире вам нужна Гуава для такой простой и важной задачи ?!
egorikem
@egorikem если ваш проект уже использует гуавы, вы можете использовать его без каких -либо дополнительных затрат ..
Стан
19
str = str.replaceAll("\\D+","");
Angoranator777
источник
Не знаю, почему люди отклонили ваше решение ... Очень помогли мне, спасибо! Голоса вверх!
Зариал
Спасибо Зариал, я вижу, что Роберт действительно отредактировал мой ответ от str = str.replaceAll ("\ D +", ""); to str = str.replaceAll ("\\ D +", ""); ... Так что я допустил эту ошибку, вставив ее в окно редактора StackO. Так что спасибо Роберт за исправление. Теперь это работает!
Angoranator777
это опровергнуто, потому что это репост. Точно такой же ответ уже был подсвечен 5 лет назад !! см. выше: stackoverflow.com/a/10372905/704246
Саад Бенбузид
@ СаадБенбузид, а? как вы определяете точно такой же ответ?
Борис Треухов
2
@SaadBenbouzid 1) это комментарий, а не ответ 2) это совершенно другое регулярное выражение 3) не все ответы, использующие регулярное выражение D, похоже на указание на то, что все ответы на языке C, которые используют, printf()являются дубликатами. Также, если вы видите ответ в комментарии, вы можете попросить мод преобразовать его в ответ или даже добавить ответ самостоятельно - ответы в комментариях не рекомендуются в StackOverlow.
Борис Треухов
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

Десятичный разделитель валюты может отличаться от локали к другой. Это всегда опасно считать .разделителем. т.е.

╔════════════════╦═══════════════════╗
    Currency          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;
}

Я надеюсь, что это может помочь ».

Махер Абутраа
источник
3

Для Android люди приходят сюда для Kotlin

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

Вывод:

cleanString = "12345.67"

Это может быть затем безопасно конвертированы toDouble(), toFloat()или toInt()при необходимости

Майкл
источник
Или номер, на чистой Java.
Алекс Бирт
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

Юрий
источник