Як видалити пробіл перед тисячами з регулярними виразами? - незвичайний

Чому я не можу позбутися пробілу перед тисячами?

Я написав такий спосіб, щоб перевірити, чи може подвійний рядок аналізувати рядок:

EDIT: Добре, я оновив метод, оскільки кожен пише ту саму відповідь - це незвична ситуація

public static boolean isNumber(String test) {
   //remove whitespaces
    System.out.print("Test is - " + test);
    test = test.replaceAll("\\s", "");
   //test = test.replaceAll("[ \\t]", "");
   //test = test.replaceAll("\\s+", "");
   //test = test.replaceAll(" ", "");
    System.out.print(" - now test is - " + test);
   //match pattern - numbers with decimal delimiter as dot or comma
    String decimalPattern = "([0-9]*)(\\.|\\,)([0-9]*)";
    boolean match = Pattern.matches(decimalPattern, test);
    System.out.println(" - Is this number? ===> " + match);
    return match;
}

І ось я йду з розуму. Ось деякі з результатів мого методу:

[stdout] Test is - aasdfg - now test is - aasdfg - Is this number? ===> false
[stdout] Test is - aa sd fg - now test is - aasdfg - Is this number? ===> false
[stdout] Test is - 123.50 - now test is - 123.50 - Is this number? ===> true
[stdout] Test is - 123,50 - now test is - 123,50 - Is this number? ===> true
[stdout] Test is - 1 123.50 - now test is - 1 123.50 - Is this number? ===> false

Останній рядок виводу є дивним!

Порада - значення тесту походить з HSSFCell # getStringCellValue() - може бути, це проблема. Жоден із коментарів не працює String # replaceAll .

0
@Disco 3 1) - жорстко кодовані роботи - я знаю про це і випробував 2) без простору до тисячі (так що змінні менше 1000) працює - так 3) це не різьба, але, можливо, кодування - будь ласка, подивіться на відповідь Петра Кротті
додано Автор robson, джерело
ваш код повинен працювати .. де є ваша тест змінної оголошена .. це доступ до іншого потоку
додано Автор Anirudha, джерело
Я спрощую все. 1) змініть вашу програму, щоб вона не отримувала дані з таблиці, але "1 123.50" є жорсткою кодуванням. Це працює?. Якщо це 2), прочитайте значення з таблиці, але той, який містить лише це значення і не містить пробілів, тож ви не заміните матеріал, а лише відповідності. Це працює? Якщо так, 3) тепер є єдине значення в електронній таблиці, але з пробілами, які потребують видалення ... і т. Д. Продовжуйте робити його більш складним, поки не досягнетеся точки, з яким вона розбивається. Це звучить як будь-який інший потік, змінює значення, або існує проблема кодування ...
додано Автор matt freake, джерело

8 Відповіді

Ваш код працює для мене, якщо я ввожу 1 123

Чому б не з'ясувати, який символ має у вашому рядку?

    for (char c : test.toCharArray())
    {
        System.out.println(0+c);
    }
3
додано
Влучне зауваження! ваш цикл для змінної 2 670,99 дав результат: 160 54 55 48 44 57 57. Що це означає? перші два символи як 160?
додано Автор robson, джерело
@ Disco3 Так, ви маєте рацію - це теж працює для мене - [\ p {Z} \ s] виконує цю роботу
додано Автор robson, джерело
160 - це нерозривний простір. Див. - stackoverflow. Ru/questions/1822772/& hellip; . Регулярний вираз для пробілів не буде відповідати тому, тому вам доведеться зупинити електронну таблицю, включаючи їх, або розгорніть регулярний вираз, щоб видалити їх. У цій гілці є кілька пропозицій, таких як "\ p (javaWhitespace)"
додано Автор matt freake, джерело
Threading - це не проблема, оскільки змінна оголошується локально (String test ). У будь-якому випадку це також перепризначається.
додано Автор Peter Crotty, джерело

Оскільки пробіли перед тисячами є "дивними" пробілами, спробуйте це:

test = test.replaceAll("(\\d+)[^\\d.,]+(\\d+)|\\s+", "$1$2");

Matches any character - that are not a digit, a dot or a comma - between two digits

1
додано
Це вирішило мою проблему, дякую :-)
додано Автор robson, джерело

Звичайним способом видалення пробілу є:

test = test.replaceAll("\\s", "");

І кома не є дійсним символом прозорого double . Фактично, не всі численні комбінації також можуть бути розібраними через максимальні та мінімальні можливі значення, які може представляти подвійний.

Найпростіший і найкращий спосіб визначити, чи можна проаналізувати рядок як подвійний, це спроба розбору, це використання JDK:

public static boolean isNumber(String test) {{
    try {
        Double.parseDouble(test.trim());
        return true;
    } catch (NumberFormatException ignore) {
        return false;
    }
}
0
додано
Будь ласка, подивіться на мій метод - і прокоментував рядок - це була одна з моїх спроб і не працює також :-(
додано Автор robson, джерело
Будь ласка, див. Мій коментар до відповіді Бадхаші
додано Автор robson, джерело

Як все сказано, спробуйте за допомогою \\ s , і ось мій простий спосіб перевірити:

public static boolean isStringisDoubleOrNot(String myvalue) {
    try {
        Double.parseDouble(myvalue);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}
0
додано
На жаль, коли до вашого методу потрапляє значення 123.50 - це добре, але коли 1 123.50 - тоді він повертає помилково. Будь ласка, зверніть увагу, що я дійсно не знаю, які характеристики складають від тисячі до сотень
додано Автор robson, джерело

Я думаю, ваша змінна тест доступ до іншого потоку.

Використовуйте синхронізоване ключове слово

synchronized(test)
{
     //your complete code
}
0
додано
На жаль - не працює
додано Автор robson, джерело
як ви називаєте цей метод і звідки
додано Автор Anirudha, джерело

Скажемо, що ми не знаємо, що саме до тисячі. Це може бути \ n, \ t, '' або нічого не знаю. Тому замість видалення тільки пробілу спробуйте пройти лише цифри і крапку, з sinple "для циклу" і ігнорувати все інше.

StringBuilder sb;
for (int i = 0; i < test.length;  ++i)
     if ((test.charAt(i) >= '0'  &&  test.charAt(i) <= '9')  ||  test.charAt(i) == '.')
        sb.append(test.charAt(i));
0
додано
Це досить небезпечно, оскільки він буде робити номер навіть з наприклад: 123dsf.ds4!
додано Автор robson, джерело
Він може зробити якийсь прапор, щоб проаналізувати все між числами.
додано Автор Kamen Stoykov, джерело
String s = stemp.replaceAll("\\s","");
0
додано
Це не спрацьовує ні. Будь ласка, перегляньте моє оновлення.
додано Автор robson, джерело

як щодо такого підходу, щоб перевірити, чи можна подробити подвійну обробку рядків?

static boolean canBeParsed(String str)
{
    try
    {
        Double.parseDouble(str.trim().replaceAll("\\s",""));
    }
    catch (Exception ignored)
    {
        return false;
    }
    return true;
}

edit: якщо ви хочете видалити пробіли також з рядка, використовуйте .replaceAll ("\ s", "")

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників