X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;ds=sidebyside;f=tim%2Fprune%2Fdata%2FCoordinate.java;h=a230e775a21424a9d1fcc06aa004d0b35e92d015;hb=f1b92378a792131ac8fb33a869405851d5b2d1f7;hp=190c66573b13e2c251a434407bc02315d34c0984;hpb=1ee49ae3c8ef3aa2e63eadd458531e5f8bd4f92c;p=GpsPrune.git diff --git a/tim/prune/data/Coordinate.java b/tim/prune/data/Coordinate.java index 190c665..a230e77 100644 --- a/tim/prune/data/Coordinate.java +++ b/tim/prune/data/Coordinate.java @@ -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 { @@ -117,6 +125,7 @@ public abstract class Coordinate } // parse fields according to number found _degrees = (int) fields[0]; + _asDouble = _degrees; _originalFormat = hasCardinal?FORMAT_DEG:FORMAT_DEG_WITHOUT_CARDINAL; _fracDenom = 10; if (numFields == 2) @@ -166,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; } @@ -262,11 +272,7 @@ public abstract class Coordinate */ public boolean equals(Coordinate inOther) { - return (inOther != null && _cardinal == inOther._cardinal - && _degrees == inOther._degrees - && _minutes == inOther._minutes - && _seconds == inOther._seconds - && _fracs == inOther._fracs); + return (_asDouble == inOther._asDouble); } @@ -298,20 +304,27 @@ 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: { - answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(_degrees) + "\u00B0" - + (int) Math.floor(_minutes + _seconds / 60.0 + _fracs / 60.0 / _fracDenom + 0.5) + "'"; + int deg = _degrees; + int min = (int) Math.floor(_minutes + _seconds / 60.0 + _fracs / 60.0 / _fracDenom + 0.5); + if (min == 60) { + min = 0; deg++; + } + answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(deg) + "\u00B0" + min + "'"; break; } 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: