X-Git-Url: https://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Fdata%2FCoordinate.java;h=8b7904910b96e5da13445c7daa0aa352f15cdf41;hp=19a1688ed45cc0d0f99385c0b02ba22d50041259;hb=112bb0c9b46894adca9a33ed8c99ea712b253185;hpb=54b9d8bc8f0025ccf97a67d9dd217ef1f9cf082f diff --git a/tim/prune/data/Coordinate.java b/tim/prune/data/Coordinate.java index 19a1688..8b79049 100644 --- a/tim/prune/data/Coordinate.java +++ b/tim/prune/data/Coordinate.java @@ -76,7 +76,7 @@ public abstract class Coordinate char currChar; long[] fields = new long[4]; // needs to be long for lengthy decimals long[] denoms = new long[4]; - String secondDelim = ""; + boolean[] otherDelims = new boolean[5]; // remember whether delimiters have non-decimal chars try { // Loop over characters in input string, populating fields array @@ -97,10 +97,8 @@ public abstract class Coordinate else { inNumeric = false; - // Remember second delimiter - if (numFields == 2) { - secondDelim += currChar; - } + // Remember delimiters + if (currChar != ',' && currChar != '.') {otherDelims[numFields] = true;} } } _valid = (numFields > 0); @@ -116,16 +114,28 @@ public abstract class Coordinate _fracDenom = 10; if (numFields == 2) { - // String is just decimal degrees - double numMins = fields[1] * 60.0 / denoms[1]; - _minutes = (int) numMins; - double numSecs = (numMins - _minutes) * 60.0; - _seconds = (int) numSecs; - _fracs = (int) ((numSecs - _seconds) * 10); - _asDouble = _degrees + 1.0 * fields[1] / denoms[1]; + if (!otherDelims[1]) + { + // String is just decimal degrees + double numMins = fields[1] * 60.0 / denoms[1]; + _minutes = (int) numMins; + double numSecs = (numMins - _minutes) * 60.0; + _seconds = (int) numSecs; + _fracs = (int) ((numSecs - _seconds) * 10); + _asDouble = _degrees + 1.0 * fields[1] / denoms[1]; + } + else + { + // String is degrees and minutes (due to non-decimal separator) + _originalFormat = FORMAT_DEG_MIN; + _minutes = (int) fields[1]; + _seconds = 0; + _fracs = 0; + _asDouble = 1.0 * _degrees + (_minutes / 60.0); + } } // Differentiate between d-m.f and d-m-s using . or , - else if (numFields == 3 && (secondDelim.equals(".") || secondDelim.equals(","))) + else if (numFields == 3 && !otherDelims[2]) { // String is degrees-minutes.fractions _originalFormat = FORMAT_DEG_MIN; @@ -265,7 +275,7 @@ public abstract class Coordinate { StringBuffer buffer = new StringBuffer(); buffer.append(PRINTABLE_CARDINALS[_cardinal]) - .append(threeDigitString(_degrees)).append('°') + .append(threeDigitString(_degrees)).append('\u00B0') .append(twoDigitString(_minutes)).append('\'') .append(twoDigitString(_seconds)).append('.') .append(formatFraction(_fracs, _fracDenom)); @@ -274,13 +284,13 @@ public abstract class Coordinate } case FORMAT_DEG_MIN: { - answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(_degrees) + "°" + answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(_degrees) + "\u00B0" + (_minutes + _seconds / 60.0 + _fracs / 60.0 / _fracDenom) + "'"; break; } case FORMAT_DEG_WHOLE_MIN: { - answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(_degrees) + "°" + answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(_degrees) + "\u00B0" + (int) Math.floor(_minutes + _seconds / 60.0 + _fracs / 60.0 / _fracDenom + 0.5) + "'"; break; }