Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблема с преобразованием формата строки

java
Теги: #<Tag:0x00007f7b6d60e858>

(Alexey Bes) #1

Проблема возникла с тестированием сайта, но я кратко объясню суть.
Есть число и сnрока, нужно привести число к формату строки.
double i = 1450.00; String s1 = "1 450,00 грн."; String s2 = String.format("%,.2f", i); s2 = s2.replace(".", ","); System.out.println(s1); System.out.println(s2 + " грн."); boolean b = s1.equals(s2 + " грн."); System.out.println(b);
в консоль выводит:
1 450,00 грн.
1 450,00 грн.
false
Помогите пожалуйста разобраться


(Xasatx) #2

Проверь пробелы, они бывают разные


(Stan) #3

картинка велосипеда

String str = "1 450,00 test";
str = str.replaceAll("[^\\d.,]", "").replace(",", ".");
float fl = Float.parseFloat(str);

(Sergey Korol) #4

Во-первых, вы выбрали заведомо неверную стратегию. Во-вторых, - типы данных.
Объясняю…

  • Для currency есть специальный формат -> BigDecimal, и уж никак не double.
  • Для операций с валютой есть специальная библиотека -> JavaMoney.

Итого, с UI нам приходит строка, expected result храним в виде BigDecimal, локализуем и форматируем при помощи NumberFormat, операции осуществляем при помощи JavaMoney.

        final NumberFormat formatter = DecimalFormat.getInstance(Locale.forLanguageTag("uk-UA"));
        final DecimalFormatSymbols customSymbols = new DecimalFormatSymbols();
        customSymbols.setDecimalSeparator(',');
        customSymbols.setGroupingSeparator(' ');
        ((DecimalFormat)formatter).setDecimalFormatSymbols(customSymbols);
        formatter.setGroupingUsed(true);

        try {
            final String actual = "1 450,01 грн.";
            final BigDecimal expected = new BigDecimal(formatter.parse("1 450,00 грн.").toString());

            MonetaryAmount actualAmount = Money.of(formatter.parse(actual), formatter.getCurrency().getCurrencyCode());
            MonetaryAmount expectedAmount = Money.of(expected, formatter.getCurrency().getCurrencyCode());
            Assert.assertTrue(actualAmount.isEqualTo(expectedAmount));
        } catch (ParseException e) {
            // handle me
        }

(Alexey Bes) #5

Спасибо, я правда уже иначе сделал, но почитаю и попробую и попробую ваш метод, для развития)


(Stan) #6

Я как-то пропустил что надо было наоборот, ну и ладно :slight_smile:


(sidelnikovmike) #7

А что в итоге то помогло?


(Stan) #8

Изначальный вопрос поставлен некорректно, потому что строки будут:
1 450,00 грн. 1,450,00 грн.
Естественно они разные.


(Alexey Bes) #9

Я уловил вашу мысль и сделал как раз на оборот, все равно что сравнивать, по-большому счету.


(Alexey Bes) #10

Пошел по простому пути не стал отделать тысячи пробелом)) А на счет разных пробелов нашел только статью на хабре о пробелах в Unicode. http://habrahabr.ru/post/23250/ а как заменить один пробел на другой в джава пока еще не нашел и не пробовал ничего.