Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 DecimalFormat - непонятные результаты  [new]
shalamyansky
Member

Откуда:
Сообщений: 197
Пытаюсь использовать класс java.text.DecimalFormat, и накак не могу понять логику вот такой его работы:

String result = ( new DecimalFormat( pattern ) ).format( number );

    number      pattern    result       comment    expected

1   123.456     #          123,456      ok

2   123.456     #.#        123,456      ok

3   123.456     0.0        123,5        ok

4   123.456     #.0        123,456      why?       123,5

5   123.456     0.#        123,         why?       123,456

6   123.456     abc0.0     abc123,5     ok

7   123.456     abc#       abc123       why?       abc123,456

8   123.456     abc#.#     abc123       why?!      abc123,456

9   123.456     abc        abc123       why?!      abc

10  123.456     (empty)    123,456      why?!      (empty string)


Возможно она существует, эта логика, но я её никак понять не могу. Буду благодарен за ваши объяснения.

Java 1.8

Сообщение было отредактировано: 5 ноя 20, 19:28
5 ноя 20, 19:28    [22227114]     Ответить | Цитировать Сообщить модератору
 Re: DecimalFormat - непонятные результаты  [new]
shalamyansky
Member

Откуда:
Сообщений: 197
Прошу простить, оказывается, у меня при передаче параметра через URL пропадал символ #. Кое-какие результаты "исправились", но далеко не все:

    number      pattern    result       comment    expected

1   123.456     #          123,456      ok

2   123.456     #.#        123,456      ok

3   123.456     0.0        123,5        ok

4   123.456     #.0        123,5        ok

5   123.456     0.#        123,5        why?       123,456

6   123.456     abc0.0     abc123,5     ok

7   123.456     abc#       abc123       why?       abc123,456

8   123.456     abc#.#     abc123,5     why?!      abc123,456

9   123.456     abc        abc123       why?!      abc

10  123.456     (empty)    123,456      why?!      (empty string)


Сообщение было отредактировано: 5 ноя 20, 20:24
5 ноя 20, 20:28    [22227161]     Ответить | Цитировать Сообщить модератору
 Re: DecimalFormat - непонятные результаты  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Вот эти пять вопросительных знаков что ты поставил. Ты можешь прокомментировать что там вызвало удивление?

Из непоняток у тебя может быть только режим округления.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/RoundingMode.html

Всё остальное - вроде-бы понятно.
5 ноя 20, 21:05    [22227173]     Ответить | Цитировать Сообщить модератору
 Re: DecimalFormat - непонятные результаты  [new]
shalamyansky
Member

Откуда:
Сообщений: 197
В столбике expected я написал, что ожидал получить в соответствии с описанием. А result иной. Хорошо, раскрою подробее.

    number      pattern    result

2   123.456     #.#        123,456

5   123.456     0.#        123,5

(2,5). Почему в случае (2) выводятся 3 цифры после запятой, а в случае (5) - только одна? Хотя в обоих случаях за дробную часть отвечает один и тот же подпаттерн ".#".

8   123.456     abc#.#     abc123

8. Почему здесь не выведена дробная часть?

9   123.456     abc        abc123

9. Почему здесь выведены цифры 123, хотя в паттерне вообще нет ни "#", ни "0", только префикс (или суффикс) "abc"? Ожидалась на выходе только сама строка "abc".

10  123.456     (empty)    123,456

10.Почему тут вообще что-то выведено? Пустой паттерн - пустой результат, не?

К округлению вопросов нет.
5 ноя 20, 21:48    [22227190]     Ответить | Цитировать Сообщить модератору
 Re: DecimalFormat - непонятные результаты  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Я на этот вопрос вряд-ли отвечу. Не копал эту теорию настолько дотошно. Да и кто из джавистов копал? ХЗ.

Посмотри в исходники OpenJDK.

https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/text/DecimalFormat.java

Там всё - прозрачно. После конструктора вызывается метод void applyPattern(String pattern, boolean localized)
и он делает все что надо по настройке форматирования.

Попробуй скопировать в отдельный класс с другим именем и стань отладчиком. Понаблюдай.
5 ноя 20, 22:01    [22227197]     Ответить | Цитировать Сообщить модератору
 Re: DecimalFormat - непонятные результаты  [new]
shalamyansky
Member

Откуда:
Сообщений: 197
Сорри, сорри, запутался в своих вызовах. Похоже в большинстве случаев все в порядке. Остаются только случаи

9   123.456     abc        abc123

9. Почему здесь выведены цифры 123, хотя в паттерне вообще нет ни "#", ни "0", только префикс (или суффикс) "abc"? Ожидалась на выходе только сама строка "abc".

10  123.456     (empty)    123,456

10.Почему тут вообще что-то выведено? Пустой паттерн - пустой результат, не?

Прошу прощения за введение в заблуждение и отнятое время, если кто проверять стал.
5 ноя 20, 22:07    [22227199]     Ответить | Цитировать Сообщить модератору
 Re: DecimalFormat - непонятные результаты  [new]
shalamyansky
Member

Откуда:
Сообщений: 197
mayton

Попробуй скопировать в отдельный класс с другим именем и стань отладчиком. Понаблюдай.


Тогда уж свой класс и оставить, и в нем все, как желаемо, и делать. Я, собственно, и стартовал, чтобы свой форматтер сделать,
а DecimalFormat взять как основу, чтобы на него возложить простые случаи. Но он повел себя немного станно, с моей точки зрения. Хотя, как оказалось, большинство странностей объяснилось моей неаккуратностью.

Спасибо!

Сообщение было отредактировано: 5 ноя 20, 22:12
5 ноя 20, 22:14    [22227202]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить