RFR: 8159023: Engineering notation of DecimalFormat does not work as documented [v2]
Naoto Sato
naoto at openjdk.org
Mon May 22 23:34:51 UTC 2023
On Mon, 22 May 2023 23:03:10 GMT, Justin Lu <jlu at openjdk.org> wrote:
>> Please review this PR which updates the Scientific Notation section of Decimal Format. It aims to resolve [JDK-8159023](https://bugs.openjdk.org/browse/JDK-8159023) as well as [JDK-6282188](https://bugs.openjdk.org/browse/JDK-6282188).
>>
>> **Scientific Notation** in Decimal Format contains the definition for a scientific notation formatted number's mantissa as such: _The number of significant digits in the mantissa is the sum of the minimum integer and maximum fraction digits, and is unaffected by the maximum integer digits. For example, 12345 formatted with "##0.##E0" is "12.3E3"._
>>
>> Both the definition and example are incorrect, as the actual result is "12.E345".
>>
>> The following example data show that scientific notation formatted numbers do not adhere to that definition. As, according to the definition, the following numbers should have 3 significant digits, but in reality, they have up to 5.
>>
>> 123 formatted by ##0.#E0 is 123E0
>> 1234 formatted by ##0.#E0 is 1.234E3
>> 12345 formatted by ##0.#E0 is 12.34E3
>> 123456 formatted by ##0.#E0 is 123.5E3
>> 1234567 formatted by ##0.#E0 is 1.235E6
>> 12345678 formatted by ##0.#E0 is 12.35E6
>> 123456789 formatted by ##0.#E0 is 123.5E6
>>
>>
>> The actual definition of the mantissa, as well as examples and further context are included in this change. In addition, a test has been added that tests various patterns to numbers and ensures the format follows the new definition's mathematical expression.
>
> Justin Lu has updated the pull request incrementally with one additional commit since the last revision:
>
> Review: Use Static dfs, error message, and exponent digit. Hard code min and max digits instead of calculating at runtime
Thanks, Justin. Left some super-nits.
test/jdk/java/text/Format/DecimalFormat/MantissaDigits.java line 52:
> 50: 1.1234, 1.1111, 1.412, 222.333, -771.2222
> 51: };
> 52: private static final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
The `static final` field is better uppercased.
test/jdk/java/text/Format/DecimalFormat/MantissaDigits.java line 64:
> 62: for (double number : numbers) {
> 63: // Count the significant digits in the pre-formatted number
> 64: int originalNumDigits = String.valueOf(number)
It's OK as it stands, but you could write:
str.chars().filter(Character::isDigit).count()
which might be more readable
-------------
PR Review: https://git.openjdk.org/jdk/pull/14066#pullrequestreview-1437867369
PR Review Comment: https://git.openjdk.org/jdk/pull/14066#discussion_r1201295121
PR Review Comment: https://git.openjdk.org/jdk/pull/14066#discussion_r1201295601
More information about the core-libs-dev
mailing list