Il secondo formato sembra non valido secondo lo JavaDoc, ma in qualche modo analizza senza errori comunque.
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
In questo caso mi aspetto il comportamento del formattatore da undefined. Cioè, può produrre qualsiasi cosa vecchia e non possiamo fare affidamento sul fatto che sia coerente o significativo in alcun modo. Quindi, non so perché stai ottenendo il 23.0, ma puoi presumere che sia una sciocchezza che dovresti evitare nel tuo codice.
Aggiornamento: Ho appena eseguito un debugger tramite la libreria DecimalFormat di Java 7. Il codice non solo dice esplicitamente che '. #' È permesso, c'è un commento in là (java.text.DecimalFormat: 2582-2593) che dice che è permesso e un'implementazione che lo consente (riga 2597). Questo sembra essere in violazione del BNF documentato per il modello.
Dato che non si tratta di un comportamento documentato, non si dovrebbe fare affidamento su di esso in quanto è soggetto a modifiche tra versioni di Java o persino implementazioni di libreria.
fonte
2016-03-22 16:13:44
Mi chiedo se "". # "' È un formato valido e se non dovrebbe essere '#. #', Che risulta anche in '23'. – Tom
@Tom: DecimalFormat (". 0") funziona anche. Non ho visto nulla nella javadoc che proibisca cose come ". #". – MGn
* "Non ho visto nulla nella javadoc che proibisca cose come". # "" * Nemmeno io, ma questo non significa che il codice possa gestirlo correttamente. Anche che 'DecimalFormat (". 0 ")' funziona può essere una coincidenza quando '. #' O '.0' non sono validi e il" fallback "stampa solo il numero, poiché risulterebbe nella stessa stringa (' "23.0" '). Ma di nuovo, è solo una supposizione. – Tom