Hi Pekka and Andrew,
I've attached the patch classpath-ivmai-41.diff.txt (a simple one) that sets
stop pos to the end of line (as in the RI). This patch assumes
classpath-ivmai-39.diff applied.
Changelog entries:
* java/text/DecimalFormat.java: (parse): Set parse stop position to
the end of string (to match the RI behavior); create number string
buffer specifying its capacity.
Regards.
Tue, 7 Dec 2010 15:30:37 +0200 Pekka Enberg <[email protected]>:
> On Tue, Dec 7, 2010 at 3:25 PM, Dr Andrew John Hughes
> <[email protected]> wrote:
> >> I meant applications relying on the current behavior of OpenJDK so
> >> it's probably not worth it to make the behavior
> "correct" in either of
> >> the projects. But sure, I do think your patch is an improvement as-is
> >> so I'm for merging your patch even with the stop position
> calculation
> >> (that I think needs to go at some point).
> >>
> >> Is there some GNU Classpath maintainer around who agrees or disagrees
> >> with the patch? What can we do to make the patch more palatable for
> >> merging?
> >
> > I haven't looked at the patch yet. This thread is rather hard to
> > follow and doesn't seem to connect to the original patch post.
> >
> > However, I think the OpenJDK behaviour is correct and the expected
> > result of the test case wrong. The NumberFormat class is designed
> > for both formatting and parsing. The documentation is rather unclear,
> > but does state:
> >
> > 'NumberFormat and DecimalFormat are designed such that some controls
> work for formatting and others work for parsing'
> >
> > and
> >
> > 'You can also control the display of numbers with such methods as
> setMinimumFractionDigits.'
> >
> > (note the word 'display')
> >
> > so I believe these setMin, setMax, etc. methods are only meant to affect
> the display of the numbers.
>
> Yeah, makes sense.
>
> > Indeed, if you change the last line of the test case to:
> >
> >
> System.out.println(numberFormat.format(numberFormat.parse("1234567890")));
> >
> > OpenJDK will print "90" while Classpath prints "34"
> (because of the earlier broken parsing). So
> > max/min is interpreted right to left.
> >
> > Thus, Classpath should be fixed to give the same results as OpenJDK.
> >
> > One thing Classpath could do is document this much better...
>
> Yup. Agreed.
>
> Pekka
diff -ru CVS/classpath/java/text/DecimalFormat.java
updated/classpath/java/text/DecimalFormat.java
--- CVS/classpath/java/text/DecimalFormat.java 2010-12-07 23:27:03.512436500
+0300
+++ updated/classpath/java/text/DecimalFormat.java 2010-12-11
20:55:54.946094000 +0300
@@ -659,26 +659,16 @@
char decimalSeparator = symbols.getDecimalSeparator();
char zero = symbols.getZeroDigit();
char exponent = symbols.getExponential();
-
- // stop parsing position in the string
- int stop = start + maximumIntegerDigits;
- if (maximumFractionDigits > 0)
- stop += maximumFractionDigits + 1;
- if (useExponentialNotation)
- stop += (minExponentDigits > 0 ? minExponentDigits : 1) + 2;
+ char groupingSeparator = symbols.getGroupingSeparator();
boolean inExponent = false;
- // correct the size of the end parsing flag
- int len = str.length();
- if (len < stop) stop = len;
- char groupingSeparator = symbols.getGroupingSeparator();
-
// this will be our final number
- CPStringBuilder number = new CPStringBuilder();
+ int len = str.length();
+ CPStringBuilder number = new CPStringBuilder(len - start);
int i;
- for (i = start; i < stop; i++)
+ for (i = start; i < len; i++)
{
char ch = str.charAt(i);
if (ch >= zero && ch <= (zero + 9))