Ответ 1
Второй формат кажется недействительным в соответствии с JavaDoc, но каким-то образом он все равно разбирает без ошибок.
Pattern: PositivePattern PositivePattern ; NegativePattern PositivePattern: Prefixopt Number Suffixopt NegativePattern: Prefixopt Number Suffixopt Prefix: any Unicode characters except \uFFFE, \uFFFF, and special characters Suffix: any Unicode characters except \uFFFE, \uFFFF, and special characters Number: Integer Exponentopt Integer . Fraction Exponentopt Integer: MinimumInteger # # Integer # , Integer MinimumInteger: 0 0 MinimumInteger 0 , MinimumInteger Fraction: MinimumFractionopt OptionalFractionopt MinimumFraction: 0 MinimumFractionopt OptionalFraction: # OptionalFractionopt Exponent: E MinimumExponent MinimumExponent: 0 MinimumExponentopt
В этом случае я ожидаю, что поведение форматирования будет undefined. То есть, это может порождать любую старую вещь, и мы не можем полагаться на то, что она является последовательной или значимой. Итак, я не знаю, почему вы получаете 23.0, но можете предположить, что это бессмыслица, которую вы должны избегать в своем коде.
Update: Я только что запустил отладчик через библиотеку Java 7 DecimalFormat. Код не только явно указывает, что разрешен ". #", Там есть комментарий (java.text.DecimalFormat: 2582-2593), который говорит, что он разрешен, и реализацию, которая позволяет это (строка 2597). Это, по-видимому, нарушает документированный BNF для шаблона.
Учитывая, что это не документированное поведение, вы действительно не должны полагаться на него, поскольку оно может изменяться между версиями Java или даже реализацией библиотек.