aboutsummaryrefslogtreecommitdiffstats
path: root/src/cgeo/geocaching/cgBase.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cgeo/geocaching/cgBase.java')
-rw-r--r--src/cgeo/geocaching/cgBase.java34
1 files changed, 12 insertions, 22 deletions
diff --git a/src/cgeo/geocaching/cgBase.java b/src/cgeo/geocaching/cgBase.java
index 483d3a5..933d9df 100644
--- a/src/cgeo/geocaching/cgBase.java
+++ b/src/cgeo/geocaching/cgBase.java
@@ -72,6 +72,7 @@ import android.widget.EditText;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.files.LocParser;
+import cgeo.geocaching.geopoint.DistanceParser;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.utils.CollectionUtils;
@@ -173,7 +174,9 @@ public class cgBase {
private static final Pattern patternViewstateFieldCount = Pattern.compile("id=\"__VIEWSTATEFIELDCOUNT\"[^(value)]+value=\"(\\d+)\"[^>]+>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
private static final Pattern patternViewstates = Pattern.compile("id=\"__VIEWSTATE(\\d*)\"[^(value)]+value=\"([^\"]+)\"[^>]+>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
private static final Pattern patternIsPremium = Pattern.compile("<span id=\"ctl00_litPMLevel\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
- public static final double kmInMiles = 1 / 1.609344;
+ public static final double miles2km = 1.609344;
+ public static final double feet2km = 0.0003048;
+ public static final double yards2km = 0.0009144;
public static final double deg2rad = Math.PI / 180;
public static final double rad2deg = 180 / Math.PI;
public static final float erad = 6371.0f;
@@ -2118,7 +2121,12 @@ public class cgBase {
try {
final Matcher matcherDistance = PATTERN_TRACKABLE_Distance.matcher(page);
if (matcherDistance.find() && matcherDistance.groupCount() > 0) {
- trackable.distance = parseDistance(matcherDistance.group(1));
+ try {
+ trackable.distance = DistanceParser.parseDistance(matcherDistance.group(1), settings.units);
+ } catch (NumberFormatException e) {
+ trackable.distance = null;
+ throw e;
+ }
}
} catch (Exception e) {
// failed to parse trackable distance
@@ -2353,24 +2361,6 @@ public class cgBase {
return text.trim();
}
- public static Double parseDistance(String dst) {
- Double distance = null;
-
- final Pattern pattern = Pattern.compile("([0-9\\.,]+)[ ]*(km|mi)", Pattern.CASE_INSENSITIVE);
- final Matcher matcher = pattern.matcher(dst);
- while (matcher.find()) {
- if (matcher.groupCount() > 1) {
- if (matcher.group(2).equalsIgnoreCase("km")) {
- distance = Double.valueOf(matcher.group(1));
- } else {
- distance = Double.valueOf(matcher.group(1)) / kmInMiles;
- }
- }
- }
-
- return distance;
- }
-
public static double getDistance(final Geopoint coords1, final Geopoint coords2) {
if (coords1 == null || coords2 == null) {
return 0;
@@ -2401,7 +2391,7 @@ public class cgBase {
}
if (settings.units == cgSettings.unitsImperial) {
- distance *= kmInMiles;
+ distance /= miles2km;
if (distance > 100) {
return String.format(Locale.getDefault(), "%.0f", Double.valueOf(Math.round(distance))) + " mi";
} else if (distance > 0.5) {
@@ -2437,7 +2427,7 @@ public class cgBase {
String unit = "km/h";
if (this.settings.units == cgSettings.unitsImperial) {
- kph *= kmInMiles;
+ kph /= miles2km;
unit = "mph";
}