You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlbeans.apache.org by ra...@apache.org on 2008/03/26 23:12:34 UTC

svn commit: r641600 - in /xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl: util/XsTypeConverter.java values/JavaDecimalHolder.java

Author: radup
Date: Wed Mar 26 15:12:12 2008
New Revision: 641600

URL: http://svn.apache.org/viewvc?rev=641600&view=rev
Log:
Fix for XMLBEANS-175 Validation of Decimal in exponential notation

Modified:
    xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
    xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/JavaDecimalHolder.java

Modified: xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java?rev=641600&r1=641599&r2=641600&view=diff
==============================================================================
--- xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java (original)
+++ xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java Wed Mar 26 15:12:12 2008
@@ -175,7 +175,52 @@
 
     public static String printDecimal(BigDecimal value)
     {
-        return value.toString();
+        // We can't simply use value.toString() here, because in JDK1.5 that returns an
+        // exponent String and exponents are not allowed in XMLSchema decimal values
+        BigDecimal bd = value;
+        int scale = bd.scale();
+        if (scale < 0)
+        {
+            bd.setScale(0);
+            return printInteger(bd.unscaledValue());
+        }
+        else if (scale == 0)
+            return printInteger(bd.unscaledValue());
+        else
+        {
+            String intString = bd.unscaledValue().abs().toString();
+            int signum = bd.signum();
+            StringBuffer buf;
+            int insertionPoint = intString.length() - scale;
+            if (insertionPoint == 0)
+            {   /* Point goes right before intVal */
+                buf = new StringBuffer(3 + intString.length());
+                buf.append(signum < 0 ? "-0." : "0.").append(intString);
+            }
+            else if (insertionPoint > 0)
+            {   /* Point goes inside intVal */
+                buf = new StringBuffer(intString.length() + 2);
+                if (signum < 0)
+                {
+                    buf.append('-').append(intString);
+                    buf.insert(insertionPoint + 1, '.');
+                }
+                else
+                {
+                    buf.append(intString);
+                    buf.insert(insertionPoint, '.');
+                }
+            }
+            else
+            {   /* We must insert zeros between point and intVal */
+                buf = new StringBuffer(3 - insertionPoint + intString.length());
+                buf.append(signum < 0 ? "-0." : "0.");
+                for (int i = 0; i < -insertionPoint; i++)
+                    buf.append('0');
+                buf.append(intString);
+            }
+            return buf.toString();
+        }
     }
 
     // ======================== integer ========================

Modified: xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/JavaDecimalHolder.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/JavaDecimalHolder.java?rev=641600&r1=641599&r2=641600&view=diff
==============================================================================
--- xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/JavaDecimalHolder.java (original)
+++ xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/JavaDecimalHolder.java Wed Mar 26 15:12:12 2008
@@ -23,6 +23,7 @@
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.impl.common.ValidationContext;
 import org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem;
+import org.apache.xmlbeans.impl.util.XsTypeConverter;
 
 public class JavaDecimalHolder extends XmlObjectBase
 {
@@ -34,7 +35,7 @@
     // SIMPLE VALUE ACCESSORS BELOW -------------------------------------------
 
     // sets/gets raw text value
-    protected String compute_text(NamespaceManager nsm) { return _value.toString(); }
+    protected String compute_text(NamespaceManager nsm) { return XsTypeConverter.printDecimal(_value); }
     protected void set_text(String s)
     {
         if (_validateOnSet())



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: commits-help@xmlbeans.apache.org