Fix external issue 1581: Double.parseDouble treats whitespace differently in hosted mode
Allow whitespace in Float.parseFloat and Double.parseDouble. Also, allow both 'e' and
'E' for the exponent delimiter. Add some unit tests.
Review by: fabbott (desk review)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7344 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/lang/Number.java b/user/super/com/google/gwt/emul/java/lang/Number.java
index 2628318..b96270b 100644
--- a/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -164,7 +164,7 @@
private static native double __parseDouble(String str) /*-{
var floatRegex = @java.lang.Number::floatRegex;
if (!floatRegex) {
- floatRegex = @java.lang.Number::floatRegex = /^[+-]?\d*\.?\d*(e[+-]?\d+)?$/i;
+ floatRegex = @java.lang.Number::floatRegex = /^\s*[+-]?\d*\.?\d*([eE][+-]?\d+)?\s*$/i;
}
if (floatRegex.test(str)) {
return parseFloat(str);
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
index 283763b..4440997 100644
--- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -78,5 +78,20 @@
assertTrue(
"Can't parse MAX_VALUE",
Double.MAX_VALUE == Double.parseDouble(String.valueOf(Double.MAX_VALUE)));
+
+ // Test that leading and trailing whitespace is ignored
+ // Test that both 'e' and 'E' may be used as the exponent delimiter
+ assertTrue(2.56789e1 == Double.parseDouble("2.56789e1"));
+ assertTrue(2.56789e1 == Double.parseDouble(" 2.56789E+1"));
+ assertTrue(2.56789e1 == Double.parseDouble("2.56789e1 "));
+ assertTrue(2.56789e1 == Double.parseDouble(" 2.56789E01 "));
+ assertTrue(2.56789e1 == Double.parseDouble("+2.56789e1"));
+ assertTrue(2.56789e1 == Double.parseDouble(" +2.56789E+01"));
+ assertTrue(2.56789e1 == Double.parseDouble("+2.56789e1 "));
+ assertTrue(2.56789e1 == Double.parseDouble(" +2.56789E1 "));
+ assertTrue(-2.56789e1 == Double.parseDouble("-2.56789e+1"));
+ assertTrue(-2.56789e1 == Double.parseDouble(" -2.56789E1"));
+ assertTrue(-2.56789e1 == Double.parseDouble("-2.56789e+01 "));
+ assertTrue(-2.56789e1 == Double.parseDouble(" -2.56789E1 "));
}
}
diff --git a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
index 711e087..f008436 100644
--- a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
@@ -76,6 +76,27 @@
} catch (NumberFormatException e) {
// Expected behavior
}
+
+ try {
+ Integer.parseInt("-");
+ fail("parseInt should reject \"-\"");
+ } catch (NumberFormatException e) {
+ // Expected behavior
+ }
+
+ try {
+ Integer.parseInt(" -12345");
+ fail("parseInt should reject leading whitespace");
+ } catch (NumberFormatException e) {
+ // Expected behavior
+ }
+
+ try {
+ Integer.parseInt("-12345 ");
+ fail("parseInt should reject trailing whitespace");
+ } catch (NumberFormatException e) {
+ // Expected behavior
+ }
}
public void testBinaryString() {