Please review this PR which handles an edge case pattern bug with ChoiceFormat.


var d = new ChoiceFormat("0#foo|1#bar|baz|") // creates cFmt equivalent to 
"0.0#foo|1.0#bar|1.0#"
d.format(1) // unexpectedly returns ""


Not only does this lead to faulty formatting results, but breaks the 
ChoiceFormat class invariant of duplicate limits.

It would have been preferable if either an exception was thrown when the 
ChoiceFormat was initially created, or the ChoiceFormat formatting 1 returned a 
value of "bar".

For comparison,

var d = new ChoiceFormat("0#foo|1#bar|baz") // creates cFmt equivalent to 
"0.0#foo|1.0#bar"
d.format(1) // returns "bar"


After this change, the first code snippet now returns "bar" when formatting 1 
and discards the "baz" as the second code snippet does.


This PR includes a lot of cleanup to the applyPattern implementation, the 
specific fix for this bug is addressed with the following, on line 305,

if (seg != Segment.FORMAT) {
    // Discard incorrect portion and finish building cFmt
    break;
}

This prevents a limit/format entry from being built when the current parsing 
mode has not yet processed the limit and relation. The previous implementation 
would build an additional limit/format of 1 with an empty string. The `break` 
allows for the discarding of the incorrect portion and continuing. 
Alternatively an exception could have been thrown. For consistency with the 
second code snippet, the former was picked.

https://github.com/openjdk/jdk/pull/17856 may be of interest, which is a 
semi-related specification fix.

-------------

Commit messages:
 - add additional longer test case
 - shorten relational symbol in format comment
 - preserve final modifier for next/previousDouble
 - reduce visibility of Segment enum
 - init

Changes: https://git.openjdk.org/jdk/pull/17883/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=17883&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8325898
  Stats: 187 lines in 2 files changed: 74 ins; 55 del; 58 mod
  Patch: https://git.openjdk.org/jdk/pull/17883.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/17883/head:pull/17883

PR: https://git.openjdk.org/jdk/pull/17883

Reply via email to