Java String видалити всі нечислові символи


237

Намагаються видалити всі літери та символи, які не мають 0-9 та періоду. Я використовую, Character.isDigit()але він також видаляє десятковий, як я можу також зберігати десяткову?


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

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.]", "");
yeaaaahhhh..hamf hamf

1
@ Оскар Лопес: як також включати від’ємні числа? Я маю на увазі, що я повинен замінити все, що не є позитивним / негативним числом, на порожнє місце. Як це зробити?
Панкай Сінгал

3
@PankajSinghal просто включіть знак «мінус» у регулярне вираження:[^\\d.-]
Óscar López

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 У регулярному виразі [^означає, що не ці персонажі, а всередині а []- .це просто.
Пітер Лоурі

1
Оскільки a .- це просто a aі нічого не означає, чи можу я просто його позбутися?
Мансур Фахад

@MansourFahad лише у тому випадку, якщо ви не хочете, .щоб у вашому результаті не було жодних .
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


Дякую за велику ансве !! 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-libraries/wiki/StringsExplained


1
Чому б у світі вам потрібна Гуава для такого легкого та найважливішого завдання ?!
egorikem

@egorikem, якщо у вашому проекті вже використовується гуава, ви можете користуватися ним без зайвих витрат ..
stan

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

Не знаю, чому люди підтримали ваше рішення ... Допомогли мені багато, дякую! Голосує!
Заріал

Дякую Заріалю, я бачу, що Роберт фактично відредагував мою відповідь з str = str.replaceAll ("\ D +", ""); до str = str.replaceAll ("\\ D +", ""); ... Тож я зробив цю помилку, вставивши її в поле редактора StackO. Тож дякую Роберту за виправлення. Тепер це працює!
Angoranator777

це знижено, тому що це репост. Точна відповідь вже була підкреслена 5 років тому !! дивись вище: stackoverflow.com/a/10372905/704246
Саад Benbouzid

@SaadBenbouzid так? яке ваше визначення точно такої самої відповіді?
Борис Треухов

2
@SaadBenbouzid 1), що є коментарем, а не відповіддю 2), що є абсолютно іншим зразком 3) не всі відповіді, в яких використовується regex 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допомогою стандартного локального або вказаного.
  • Готуйте схему регулярного вираження з десятковим символом, щоб отримати лише цифри

І ось як я це вирішую:

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 людей, які приїжджають сюди за Котлін

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.