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;
inString = inString.trim();
strLen = inString.length();
}
- if (strLen > 1)
+ if (strLen > 0)
{
// Check for cardinal character either at beginning or end
boolean hasCardinal = true;
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
{
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;
}
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:
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: