BigDecimal (valueOf): fix DiagBigDecimal val008, val013 tests; see patch #1016 on...
authorStephen Crawley <crawley@dstc.edu.au>
Fri, 7 Feb 2003 21:05:12 +0000 (21:05 +0000)
committerMark Wielaard <mark@gcc.gnu.org>
Fri, 7 Feb 2003 21:05:12 +0000 (21:05 +0000)
2003-02-07  Stephen Crawley  <crawley@dstc.edu.au>

       * java/math/BigDecimal(valueOf): fix DiagBigDecimal val008, val013
       tests; see patch #1016 on Savannah.

2003-02-07  Stephen Crawley  <crawley@dstc.edu.au>

       * java/math/BigDecimal.java (BigDecimal): enhance parsing of exponents
       (toString): do not return Strings starting with . and - erroneously.
       Improves Mauve results to 12 of 600 instead of 16 of 338 on
       DiagBigDecimal.

From-SVN: r62540

libjava/ChangeLog
libjava/java/math/BigDecimal.java

index 32167d5425e17d85666814895799e385ac1d4eeb..493794200f71e14f34e4dcbefdf0753df0be34f8 100644 (file)
@@ -1,3 +1,15 @@
+2003-02-07  Stephen Crawley  <crawley@dstc.edu.au>
+
+       * java/math/BigDecimal(valueOf): fix DiagBigDecimal val008, val013
+       tests; see patch #1016 on Savannah.
+
+2003-02-07  Stephen Crawley  <crawley@dstc.edu.au>
+
+       * java/math/BigDecimal.java (BigDecimal): enhance parsing of exponents
+       (toString): do not return Strings starting with . and - erroneously.
+       Improves Mauve results to 12 of 600 instead of 16 of 338 on
+       DiagBigDecimal.
+
 2003-02-07  Stephen Crawley  <crawley@dstc.edu.au>
 
        * java/beans/PropertyDescriptor.java
index 713ba08e151ea92a17441dc3461da50874c4bc03..9c6e194a01601927d4c15228b18497ef86c9c3a9 100644 (file)
@@ -178,15 +178,29 @@ public class BigDecimal extends Number implements Comparable
     // Now parse exponent.
     if (point < len)
       {
-       int exp = Integer.parseInt (num.substring (point + 1));
-       exp -= scale;
-       if (exp > 0)
+        point++;
+        if (num.charAt(point) == '+')
+          point++;
+
+        if (point >= len )
+          throw new NumberFormatException ("no exponent following e or E");
+       
+        try 
          {
-           intVal = intVal.multiply (BigInteger.valueOf (10).pow (exp));
-           scale = 0;
+           int exp = Integer.parseInt (num.substring (point));
+           exp -= scale;
+           if (exp > 0)
+             {
+               intVal = intVal.multiply (BigInteger.valueOf (10).pow (exp));
+               scale = 0;
+             }
+           else
+             scale = - exp;
+         }
+        catch (NumberFormatException ex) 
+         {
+           throw new NumberFormatException ("malformed exponent");
          }
-       else
-         scale = - exp;
       }
   }
 
@@ -198,7 +212,7 @@ public class BigDecimal extends Number implements Comparable
   public static BigDecimal valueOf (long val, int scale) 
     throws NumberFormatException 
   {
-    if (scale == 0)
+    if ((scale == 0) && ((int)val == val))
       switch ((int) val)
        {
        case 0:
@@ -431,19 +445,29 @@ public class BigDecimal extends Number implements Comparable
     if (scale == 0) 
       return bigStr;
 
-    int point = bigStr.length() - scale;
     boolean negative = (bigStr.charAt(0) == '-');
-    StringBuffer sb = new StringBuffer(bigStr.length() + 1 + 
-                                      (point <= 0 ? -point+1 : 0));
-    if (negative)
-      sb.append('-');
-    while (point <= 0)
+
+    int point = bigStr.length() - scale - (negative ? 1 : 0);
+
+    StringBuffer sb = new StringBuffer(bigStr.length() + 2 +
+                                      (point <= 0 ? (-point + 1) : 0));
+    if (point <= 0)
+      {
+        if (negative)
+          sb.append('-');
+        sb.append('0').append('.');
+        while (point < 0)
+          {
+            sb.append('0');
+            point++;
+          }
+        sb.append(bigStr.substring(negative ? 1 : 0));
+      }
+    else
       {
-       sb.append('0');
-       point++;
+       sb.append(bigStr);
+       sb.insert(point + (negative ? 1 : 0), '.');
       }
-    sb.append(bigStr.substring(negative ? 1 : 0));
-    sb.insert(point, '.');
     return sb.toString();
   }