]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/data/Coordinate.java
Version 13.4, May 2012
[GpsPrune.git] / tim / prune / data / Coordinate.java
index 556bd892797cac3834f89d316dadbb6a726d0fab..a230e775a21424a9d1fcc06aa004d0b35e92d015 100644 (file)
@@ -32,6 +32,11 @@ public abstract class Coordinate
        static {
                if (EIGHT_DP instanceof DecimalFormat) ((DecimalFormat) EIGHT_DP).applyPattern("0.00000000");
        }
+       /** Number formatter for fixed decimals with forced decimal point */
+       private static final NumberFormat FIVE_DP = NumberFormat.getNumberInstance(Locale.UK);
+       static {
+               if (FIVE_DP instanceof DecimalFormat) ((DecimalFormat) FIVE_DP).applyPattern("0.00000");
+       }
 
        // Instance variables
        private boolean _valid = false;
@@ -60,7 +65,7 @@ public abstract class Coordinate
                        inString = inString.trim();
                        strLen = inString.length();
                }
-               if (strLen > 1)
+               if (strLen > 0)
                {
                        // Check for cardinal character either at beginning or end
                        boolean hasCardinal = true;
@@ -98,8 +103,11 @@ public abstract class Coordinate
                                                        numFields++;
                                                        denoms[numFields-1] = 1;
                                                }
-                                               fields[numFields-1] = fields[numFields-1] * 10 + (currChar - '0');
-                                               denoms[numFields-1] *= 10;
+                                               if (denoms[numFields-1] < 1E18) // ignore trailing characters if too big for long
+                                               {
+                                                       fields[numFields-1] = fields[numFields-1] * 10 + (currChar - '0');
+                                                       denoms[numFields-1] *= 10;
+                                               }
                                        }
                                        else
                                        {
@@ -167,7 +175,8 @@ public abstract class Coordinate
                        if (_cardinal == WEST || _cardinal == SOUTH || inString.charAt(0) == '-')
                                _asDouble = -_asDouble;
                        // validate fields
-                       _valid = _valid && (_degrees <= getMaxDegrees() && _minutes < 60 && _seconds < 60 && _fracs < _fracDenom);
+                       _valid = _valid && (_degrees <= getMaxDegrees() && _minutes < 60 && _seconds < 60 && _fracs < _fracDenom)
+                               && Math.abs(_asDouble) <= getMaxDegrees();
                }
                else _valid = false;
        }
@@ -295,7 +304,7 @@ public abstract class Coordinate
                                case FORMAT_DEG_MIN:
                                {
                                        answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(_degrees) + "\u00B0"
-                                               + (_minutes + _seconds / 60.0 + _fracs / 60.0 / _fracDenom) + "'";
+                                               + FIVE_DP.format((Math.abs(_asDouble) - _degrees) * 60.0) + "'";
                                        break;
                                }
                                case FORMAT_DEG_WHOLE_MIN:
@@ -311,8 +320,11 @@ public abstract class Coordinate
                                case FORMAT_DEG:
                                case FORMAT_DEG_WITHOUT_CARDINAL:
                                {
-                                       answer = (_asDouble<0.0?"-":"")
-                                               + (_degrees + _minutes / 60.0 + _seconds / 3600.0 + _fracs / 3600.0 / _fracDenom);
+                                       if (_originalFormat != FORMAT_DEG_WITHOUT_CARDINAL)
+                                       {
+                                               answer = (_asDouble<0.0?"-":"")
+                                                       + (_degrees + _minutes / 60.0 + _seconds / 3600.0 + _fracs / 3600.0 / _fracDenom);
+                                       }
                                        break;
                                }
                                case FORMAT_DECIMAL_FORCE_POINT: