Какой символ использует DecimalFormat вместо пробела?

300
01 марта 2019, 02:50

Пытаюсь убрать пробелы из строки, но ничего не происходит.

public class Main {
    public static void main(String[] args) {
        int i = 66;
        int j = 66;
        DecimalFormat format = new DecimalFormat();
        format.setDecimalSeparatorAlwaysShown(false);
        String s = String.valueOf(format.format(i*j )).replaceAll("\\s", "");
        double d = Double.parseDouble(s);
    }
}

ошибка

Exception in thread "main" java.lang.NumberFormatException: For input string: "4 356"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at Main.main(Main.java:13)

с чем это связано и как убрать этот псевдопробел? PS: если написать просто строку с пробелом replaceAll работает нормально

Answer 1

Все потому, что тот пробел, который появляется в результате format является неразрывным, его код в ASCII таблице равен 160, что в шестнадцатеричной системе исчисления соответствует A0.

Вы можете использовать следующий regexp:

String s = String.valueOf(format.format(i*j )).replaceAll("\u00a0", "");

Будьте внимательны, что при форматировании дробного числа, точка скорее всего будет заменена на запятую (зависит от локали), что также не даст распарсить это число. Чтобы исправить эту проблему, вы можете либо в методе replaceAll заменить запятую на точку, либо использовать DecimalFormatSymbols:

DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('.');
format.setDecimalFormatSymbols(formatSymbols);

В вашем случае, так как вы умножаете целые числа и произведение всегда будет целым достаточно даже простого \\D:

String s = String.valueOf(format.format(i*j )).replaceAll("\\D", "");

"\D" - Соответствует любому нецифровому символу. Эквивалентно выражению [^0-9].

Будьте внимательны, что при форматировании дробных чисел, точка в этом случае будет стерта.

READ ALSO
java.sql.sqlexception access denied for user 'root'@'192.168.0.3'

java.sql.sqlexception access denied for user 'root'@'192.168.0.3'

Пытаюсь подключиться к базе запущенной из XAMPP с другого компьютера по локалкеАдрес сервера 192

176
Конструкторы с геттерами и сеттерами и их работа

Конструкторы с геттерами и сеттерами и их работа

Друзья! Я понял как работают сеттеры, геттеры и конструкторыНо не понял одну вещь:

170
RecyclerView к списку элементов

RecyclerView к списку элементов

Проблема следующего характера, создал список checkBox-ов при помощи recyclerView, наполняю его следующим образом:

177
Нужно ли добавлять медиа-запрос, если ширина экрана <= 260px?

Нужно ли добавлять медиа-запрос, если ширина экрана <= 260px?

Недавно начал практиковаться в медиа-запросахНужно ли добавлять медиа-запрос, если ширина экрана <= 260px? Существуют ли вообще устройства...

172