From 374232fcad05372d7021393656a05b1dba293ca9 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Fri, 20 Apr 2012 22:49:55 +0200 Subject: Add more tests for getHumanDistance() --- .../cgeo/geocaching/geopoint/HumanDistance.java | 64 ++++++++++++---------- 1 file changed, 34 insertions(+), 30 deletions(-) (limited to 'main/src/cgeo/geocaching/geopoint') diff --git a/main/src/cgeo/geocaching/geopoint/HumanDistance.java b/main/src/cgeo/geocaching/geopoint/HumanDistance.java index 3c40555..25d1bb7 100644 --- a/main/src/cgeo/geocaching/geopoint/HumanDistance.java +++ b/main/src/cgeo/geocaching/geopoint/HumanDistance.java @@ -2,44 +2,48 @@ package cgeo.geocaching.geopoint; import cgeo.geocaching.Settings; +import org.apache.commons.lang3.tuple.ImmutablePair; + public class HumanDistance { - public static String getHumanDistance(final Float distanceKilometers) { - if (distanceKilometers == null) { - return "?"; - } + public static ImmutablePair scaleUnit(final double distanceKilometers) { + double distance; + String units; if (Settings.isUseMetricUnits()) { - if (distanceKilometers > 100) { - return String.format("%d", Math.round(distanceKilometers)) + " km"; - } else if (distanceKilometers > 10) { - return String.format("%.1f", Double.valueOf(Math.round(distanceKilometers * 10.0) / 10.0)) + " km"; - } else if (distanceKilometers > 1) { - return String.format("%.2f", Double.valueOf(Math.round(distanceKilometers * 100.0) / 100.0)) + " km"; - } else if (distanceKilometers > 0.1) { - return String.format("%d", Math.round(distanceKilometers * 1000.0)) + " m"; - } else if (distanceKilometers > 0.01) { - return String.format("%.1f", Double.valueOf(Math.round(distanceKilometers * 1000.0 * 10.0) / 10.0)) + " m"; + if (distanceKilometers >= 1) { + distance = distanceKilometers; + units = "km"; } else { - return String.format("%.2f", Double.valueOf(Math.round(distanceKilometers * 1000.0 * 100.0) / 100.0)) + " m"; + distance = distanceKilometers * 1000; + units = "m"; } } else { - final float miles = distanceKilometers / IConversion.MILES_TO_KILOMETER; - if (miles > 100) { - return String.format("%d", Math.round(miles)) + " mi"; - } else if (miles > 0.5) { - return String.format("%.1f", Double.valueOf(Math.round(miles * 10.0) / 10.0)) + " mi"; - } else if (miles > 0.1) { - return String.format("%.2f", Double.valueOf(Math.round(miles * 100.0) / 100.0)) + " mi"; - } - - final float feet = miles * 5280; - if (feet >= 100) { - return String.format("%d", Math.round(feet)) + " ft"; - } else if (feet >= 10) { - return String.format("%.1f", Double.valueOf(Math.round(feet * 10.0) / 10.0)) + " ft"; + distance = distanceKilometers / IConversion.MILES_TO_KILOMETER; + if (distance >= 0.1) { + units = "mi"; } else { - return String.format("%.2f", Double.valueOf(Math.round(feet * 100.0) / 100.0)) + " ft"; + distance *= 5280; + units = "ft"; } } + return new ImmutablePair(distance, units); + } + + public static String getHumanDistance(final Float distanceKilometers) { + if (distanceKilometers == null) { + return "?"; + } + + final ImmutablePair scaled = scaleUnit(distanceKilometers); + String formatString; + if (scaled.left >= 100) { + formatString = "%.0f"; + } else if (scaled.left >= 10) { + formatString = "%.1f"; + } else { + formatString = "%.2f"; + } + + return String.format(formatString + " %s", scaled.left, scaled.right); } } -- cgit v1.1