Author: desruisseaux
Date: Tue Jul 28 09:14:18 2015
New Revision: 1693044

URL: http://svn.apache.org/r1693044
Log:
WKT formatting: use scientific notation for small or large number, but not at 
the same threshold than the one used by default in the JDK.
The reason is that ellipsoid axis lengths expressed in feet are around 2.1E+7 
but are still commonly formatted in non-scientific format.

Modified:
    
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/AbstractParser.java
    
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Formatter.java
    
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Symbols.java

Modified: 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/AbstractParser.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/AbstractParser.java?rev=1693044&r1=1693043&r2=1693044&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/AbstractParser.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/AbstractParser.java
 [UTF-8] Tue Jul 28 09:14:18 2015
@@ -36,7 +36,6 @@ import org.opengis.util.InternationalStr
 import org.apache.sis.internal.system.Loggers;
 import org.apache.sis.internal.util.StandardDateFormat;
 import org.apache.sis.measure.Units;
-import org.apache.sis.util.Workaround;
 import org.apache.sis.util.logging.Logging;
 
 import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
@@ -80,16 +79,6 @@ abstract class AbstractParser implements
     static final int MANDATORY = 2;
 
     /**
-     * Set to {@code true} if parsing of number in scientific notation is 
allowed.
-     * The way to achieve that is currently a hack, because {@link 
NumberFormat}
-     * has no API for managing that as of JDK 1.8.
-     *
-     * @todo See if a future version of JDK allows us to get ride of this ugly 
hack.
-     */
-    @Workaround(library = "JDK", version = "1.8")
-    static final boolean SCIENTIFIC_NOTATION = true;
-
-    /**
      * The logger to use for reporting warnings when this parser is used 
through the {@link #createFromWKT(String)}.
      * This happen most often when the user invoke the {@link 
org.apache.sis.referencing.CRS#fromWKT(String)}
      * convenience method.
@@ -175,7 +164,7 @@ abstract class AbstractParser implements
         this.dateFormat  = dateFormat;
         this.unitFormat  = unitFormat;
         this.errorLocale = errorLocale;
-        if (SCIENTIFIC_NOTATION && numberFormat instanceof DecimalFormat) {
+        if (Symbols.SCIENTIFIC_NOTATION && numberFormat instanceof 
DecimalFormat) {
             final DecimalFormat decimalFormat = (DecimalFormat) 
((DecimalFormat) numberFormat).clone();
             exponentSymbol = 
decimalFormat.getDecimalFormatSymbols().getExponentSeparator();
             String pattern = decimalFormat.toPattern();

Modified: 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Formatter.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Formatter.java?rev=1693044&r1=1693043&r2=1693044&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Formatter.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Formatter.java
 [UTF-8] Tue Jul 28 09:14:18 2015
@@ -1099,17 +1099,32 @@ public class Formatter implements Locali
     public void append(final double number) {
         appendSeparator();
         setColor(ElementKind.NUMBER);
+        final double abs = Math.abs(number);
         /*
-         * The 2 below is for using two less fraction digits than the expected 
number accuracy.
-         * The intend is to give to DecimalFormat a chance to hide rounding 
errors, keeping in
-         * mind that the number value is not necessarily the original one (we 
may have applied
-         * a unit conversion). In the case of WGS84 semi-major axis in metres, 
we still have a
-         * maximum of 8 fraction digits, which is more than enough.
+         * Use scientific notation if the number magnitude is too high or too 
low. The threshold values used here
+         * may be different than the threshold values used in the standard 
'StringBuilder.append(double)' method.
+         * In particular, we use a higher threshold for large numbers because 
ellipsoid axis lengths are above the
+         * JDK threshold when the axis length is given in feet (about 2.1E+7) 
while we still want to format them
+         * as usual numbers.
+         *
+         * Note that we perform this special formatting only if the 
'NumberFormat' is not localized
+         * (which is the usual case).
          */
-        
numberFormat.setMaximumFractionDigits(DecimalFunctions.fractionDigitsForValue(number,
 2));
-        numberFormat.setMinimumFractionDigits(1); // Must be after 
setMaximumFractionDigits(…).
-        numberFormat.setRoundingMode(RoundingMode.HALF_EVEN);
-        numberFormat.format(number, buffer, dummy);
+        if (Symbols.SCIENTIFIC_NOTATION && (abs < 1E-3 || abs >= 1E+9) && 
symbols.getLocale() == Locale.ROOT) {
+            buffer.append(number);
+        } else {
+            /*
+             * The 2 below is for using two less fraction digits than the 
expected number accuracy.
+             * The intend is to give to DecimalFormat a chance to hide 
rounding errors, keeping in
+             * mind that the number value is not necessarily the original one 
(we may have applied
+             * a unit conversion). In the case of WGS84 semi-major axis in 
metres, we still have a
+             * maximum of 8 fraction digits, which is more than enough.
+             */
+            
numberFormat.setMaximumFractionDigits(DecimalFunctions.fractionDigitsForValue(number,
 2));
+            numberFormat.setMinimumFractionDigits(1); // Must be after 
setMaximumFractionDigits(…).
+            numberFormat.setRoundingMode(RoundingMode.HALF_EVEN);
+            numberFormat.format(number, buffer, dummy);
+        }
         resetColor();
     }
 

Modified: 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Symbols.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Symbols.java?rev=1693044&r1=1693043&r2=1693044&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Symbols.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/Symbols.java
 [UTF-8] Tue Jul 28 09:14:18 2015
@@ -21,6 +21,7 @@ import java.util.Locale;
 import java.io.Serializable;
 import java.text.NumberFormat;
 import org.apache.sis.util.Localized;
+import org.apache.sis.util.Workaround;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.resources.Errors;
 
@@ -79,6 +80,16 @@ public class Symbols implements Localize
     private static final long serialVersionUID = -1730166945430878916L;
 
     /**
+     * Set to {@code true} if parsing and formatting of number in scientific 
notation is allowed.
+     * The way to achieve that is currently a hack, because {@link 
NumberFormat} has no API for
+     * managing that as of JDK 1.8.
+     *
+     * @todo See if a future version of JDK allows us to get ride of this ugly 
hack.
+     */
+    @Workaround(library = "JDK", version = "1.8")
+    static final boolean SCIENTIFIC_NOTATION = true;
+
+    /**
      * The prefix character for the value of a WKT fragment.
      */
     static final char FRAGMENT_VALUE = '$';


Reply via email to