summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2015-05-19 10:09:22 -0700
committerKeith Packard <keithp@keithp.com>2015-05-19 10:09:22 -0700
commit3e5e9333420ede74d998556c1bbd5888e8ff75ae (patch)
treedbd6e450c8352e7a1005a28f5016d95769b962d0
parent3fbf0a29a1b8a67b90ef965ee3e2e972c0ec33a1 (diff)
altoslib: Expose locale and non-locale floating point parsing functions
UI bits use locale-specific floating point formats, so parsing those needs to use the locale. Network-based data, like .kml bits need to use non-locale-specific parsing code, so now we've got both APIs available, and each used as appropriate. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java5
-rw-r--r--altoslib/AltosGPS.java6
-rw-r--r--altoslib/AltosParse.java21
-rw-r--r--altoslib/AltosUnits.java21
-rw-r--r--altosui/AltosConfigPyroUI.java15
-rw-r--r--altosui/AltosConfigUI.java30
-rw-r--r--altosuilib/AltosConfigFreqUI.java5
-rw-r--r--altosuilib/AltosUIMapPreload.java23
-rw-r--r--telegps/TeleGPS.java9
-rw-r--r--telegps/TeleGPSConfigUI.java14
10 files changed, 105 insertions, 44 deletions
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
index b4fc3bc3..db065b3f 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
@@ -21,6 +21,7 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
+import java.text.*;
import android.app.Activity;
import android.app.PendingIntent;
@@ -687,8 +688,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener {
void setFrequency(String freq) {
try {
- setFrequency (Double.parseDouble(freq.substring(11, 17)));
- } catch (NumberFormatException e) {
+ setFrequency (AltosParse.parse_double_net(freq.substring(11, 17)));
+ } catch (ParseException e) {
}
}
diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java
index 2139efb2..e3aee4ea 100644
--- a/altoslib/AltosGPS.java
+++ b/altoslib/AltosGPS.java
@@ -195,10 +195,10 @@ public class AltosGPS implements Cloneable, Serializable {
lon = AltosParse.parse_coord(words[i++]);
alt = AltosParse.parse_int(words[i++]);
if (version > 1 || (i < words.length && !words[i].equals("SAT"))) {
- ground_speed = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(H)"));
+ ground_speed = AltosParse.parse_double_net(AltosParse.strip_suffix(words[i++], "m/s(H)"));
course = AltosParse.parse_int(words[i++]);
- climb_rate = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(V)"));
- hdop = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "(hdop)"));
+ climb_rate = AltosParse.parse_double_net(AltosParse.strip_suffix(words[i++], "m/s(V)"));
+ hdop = AltosParse.parse_double_net(AltosParse.strip_suffix(words[i++], "(hdop)"));
h_error = AltosParse.parse_int(words[i++]);
v_error = AltosParse.parse_int(words[i++]);
}
diff --git a/altoslib/AltosParse.java b/altoslib/AltosParse.java
index 2fb69c15..a8b02b56 100644
--- a/altoslib/AltosParse.java
+++ b/altoslib/AltosParse.java
@@ -17,6 +17,7 @@
package org.altusmetrum.altoslib_6;
+import java.util.*;
import java.text.*;
public class AltosParse {
@@ -40,11 +41,23 @@ public class AltosParse {
}
}
- public static double parse_double(String v) throws ParseException {
+ static NumberFormat nf_locale = NumberFormat.getInstance();
+
+ static NumberFormat nf_net = NumberFormat.getInstance(Locale.ROOT);
+
+ public static double parse_double_locale(String str) throws ParseException {
try {
- return Double.parseDouble(v);
- } catch (NumberFormatException e) {
- throw new ParseException("error parsing double " + v, 0);
+ return nf_locale.parse(str.trim()).doubleValue();
+ } catch (ParseException pe) {
+ throw new ParseException("error parsing double " + str, 0);
+ }
+ }
+
+ public static double parse_double_net(String str) throws ParseException {
+ try {
+ return nf_net.parse(str.trim()).doubleValue();
+ } catch (ParseException pe) {
+ throw new ParseException("error parsing double " + str, 0);
}
}
diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java
index f6e34e77..e266b243 100644
--- a/altoslib/AltosUnits.java
+++ b/altoslib/AltosUnits.java
@@ -17,6 +17,8 @@
package org.altusmetrum.altoslib_6;
+import java.text.*;
+
public abstract class AltosUnits {
public abstract double value(double v, boolean imperial_units);
@@ -29,13 +31,22 @@ public abstract class AltosUnits {
public abstract int show_fraction(int width, boolean imperial_units);
- public double parse(String s, boolean imperial_units) throws NumberFormatException {
- double v = Double.parseDouble(s);
+ public double parse_locale(String s, boolean imperial_units) throws ParseException {
+ double v = AltosParse.parse_double_locale(s);
+ return inverse(v, imperial_units);
+ }
+
+ public double parse_net(String s, boolean imperial_units) throws ParseException {
+ double v = AltosParse.parse_double_net(s);
return inverse(v, imperial_units);
}
- public double parse(String s) throws NumberFormatException {
- return parse(s, AltosConvert.imperial_units);
+ public double parse_locale(String s) throws ParseException {
+ return parse_locale(s, AltosConvert.imperial_units);
+ }
+
+ public double parse_net(String s) throws ParseException {
+ return parse_net(s, AltosConvert.imperial_units);
}
public double value(double v) {
@@ -105,4 +116,4 @@ public abstract class AltosUnits {
public String say_units(double v) {
return say_units(v, AltosConvert.imperial_units);
}
-} \ No newline at end of file
+}
diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java
index 61208dfe..69b31ff5 100644
--- a/altosui/AltosConfigPyroUI.java
+++ b/altosui/AltosConfigPyroUI.java
@@ -17,6 +17,7 @@
package altosui;
+import java.text.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@@ -87,9 +88,9 @@ public class AltosConfigPyroUI
if (units != null) {
try {
- double v = units.parse(value.getText(), !imperial_units);
+ double v = units.parse_locale(value.getText(), !imperial_units);
set(enabled(), v);
- } catch (NumberFormatException ne) {
+ } catch (ParseException pe) {
set(enabled(), 0.0);
}
}
@@ -129,9 +130,9 @@ public class AltosConfigPyroUI
AltosUnits units = AltosPyro.pyro_to_units(flag);
try {
if (units != null)
- return units.parse(value.getText());
- return Double.parseDouble(value.getText());
- } catch (NumberFormatException e) {
+ return units.parse_locale(value.getText());
+ return AltosParse.parse_double_locale(value.getText());
+ } catch (ParseException e) {
throw new AltosConfigDataException("\"%s\": %s\n", value.getText(), e.getMessage());
}
}
@@ -298,8 +299,8 @@ public class AltosConfigPyroUI
String v = pyro_firing_time_value.getSelectedItem().toString();
try {
- return Double.parseDouble(v);
- } catch (NumberFormatException e) {
+ return AltosParse.parse_double_locale(v);
+ } catch (ParseException e) {
throw new AltosConfigDataException("Invalid pyro firing time \"%s\"", v);
}
}
diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java
index 67decaa4..ef477ca9 100644
--- a/altosui/AltosConfigUI.java
+++ b/altosui/AltosConfigUI.java
@@ -21,6 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
+import java.text.*;
import org.altusmetrum.altoslib_6.*;
import org.altusmetrum.altosuilib_6.*;
@@ -976,8 +977,13 @@ public class AltosConfigUI
}
- public int main_deploy() {
- return (int) (AltosConvert.height.parse(main_deploy_value.getSelectedItem().toString()) + 0.5);
+ public int main_deploy() throws AltosConfigDataException {
+ String str = main_deploy_value.getSelectedItem().toString();
+ try {
+ return (int) (AltosConvert.height.parse_locale(str) + 0.5);
+ } catch (ParseException pe) {
+ throw new AltosConfigDataException("invalid main deploy height %s", str);
+ }
}
String get_main_deploy_label() {
@@ -1006,14 +1012,21 @@ public class AltosConfigUI
String v = main_deploy_value.getSelectedItem().toString();
main_deploy_label.setText(get_main_deploy_label());
set_main_deploy_values();
- int m = (int) (AltosConvert.height.parse(v, !imperial_units) + 0.5);
- set_main_deploy(m);
+ try {
+ int m = (int) (AltosConvert.height.parse_locale(v, !imperial_units) + 0.5);
+ set_main_deploy(m);
+ } catch (ParseException pe) {
+ }
if (tracker_motion_value.isEnabled()) {
String motion = tracker_motion_value.getSelectedItem().toString();
tracker_motion_label.setText(get_tracker_motion_label());
set_tracker_motion_values();
- set_tracker_motion((int) (AltosConvert.height.parse(motion, !imperial_units) + 0.5));
+ try {
+ int m = (int) (AltosConvert.height.parse_locale(motion, !imperial_units) + 0.5);
+ set_tracker_motion(m);
+ } catch (ParseException pe) {
+ }
}
if (!was_dirty)
@@ -1272,7 +1285,12 @@ public class AltosConfigUI
}
public int tracker_motion() throws AltosConfigDataException {
- return (int) AltosConvert.height.parse(tracker_motion_value.getSelectedItem().toString());
+ String str = tracker_motion_value.getSelectedItem().toString();
+ try {
+ return (int) (AltosConvert.height.parse_locale(str) + 0.5);
+ } catch (ParseException pe) {
+ throw new AltosConfigDataException("invalid tracker motion %s", str);
+ }
}
public void set_tracker_interval(int tracker_interval) {
diff --git a/altosuilib/AltosConfigFreqUI.java b/altosuilib/AltosConfigFreqUI.java
index 6253e3e4..21514a81 100644
--- a/altosuilib/AltosConfigFreqUI.java
+++ b/altosuilib/AltosConfigFreqUI.java
@@ -18,6 +18,7 @@
package org.altusmetrum.altosuilib_6;
import java.awt.*;
+import java.text.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
@@ -51,10 +52,10 @@ class AltosEditFreqUI extends AltosUIDialog implements ActionListener {
String d_s = description.getText();
try {
- double f_d = Double.parseDouble(f_s);
+ double f_d = AltosParse.parse_double_locale(f_s);
return new AltosFrequency(f_d, d_s);
- } catch (NumberFormatException ne) {
+ } catch (ParseException ne) {
}
return null;
}
diff --git a/altosuilib/AltosUIMapPreload.java b/altosuilib/AltosUIMapPreload.java
index e82b6c60..1973ae6e 100644
--- a/altosuilib/AltosUIMapPreload.java
+++ b/altosuilib/AltosUIMapPreload.java
@@ -53,33 +53,33 @@ class AltosUIMapPos extends Box {
hemi.setSelectedIndex(h);
}
- public double get_value() throws NumberFormatException {
+ public double get_value() throws ParseException {
int h = hemi.getSelectedIndex();
String d_t = deg.getText();
String m_t = min.getText();
double d, m, v;
try {
- d = Double.parseDouble(d_t);
- } catch (NumberFormatException ne) {
+ d = AltosParse.parse_double_locale(d_t);
+ } catch (ParseException pe) {
JOptionPane.showMessageDialog(owner,
String.format("Invalid degrees \"%s\"",
d_t),
"Invalid number",
JOptionPane.ERROR_MESSAGE);
- throw ne;
+ throw pe;
}
try {
if (m_t.equals(""))
m = 0;
else
- m = Double.parseDouble(m_t);
- } catch (NumberFormatException ne) {
+ m = AltosParse.parse_double_locale(m_t);
+ } catch (ParseException pe) {
JOptionPane.showMessageDialog(owner,
String.format("Invalid minutes \"%s\"",
m_t),
"Invalid number",
JOptionPane.ERROR_MESSAGE);
- throw ne;
+ throw pe;
}
v = d + m/60.0;
if (h == 1)
@@ -142,9 +142,9 @@ class AltosUISite {
name = elements[0];
try {
- latitude = Double.parseDouble(elements[1]);
- longitude = Double.parseDouble(elements[2]);
- } catch (NumberFormatException ne) {
+ latitude = AltosParse.parse_double_net(elements[1]);
+ longitude = AltosParse.parse_double_net(elements[2]);
+ } catch (ParseException pe) {
throw new ParseException(String.format("Invalid site line %s", line), 0);
}
}
@@ -171,6 +171,7 @@ class AltosUISites extends Thread {
try {
add(new AltosUISite(line));
} catch (ParseException pe) {
+ System.out.printf("parse exception %s\n", pe.toString());
}
}
@@ -394,7 +395,7 @@ public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, I
max_z = min_z;
r = (Integer) radius.getSelectedItem();
loading = true;
- } catch (NumberFormatException ne) {
+ } catch (ParseException pe) {
load_button.setSelected(false);
}
start_load();
diff --git a/telegps/TeleGPS.java b/telegps/TeleGPS.java
index fe335176..7570d380 100644
--- a/telegps/TeleGPS.java
+++ b/telegps/TeleGPS.java
@@ -23,6 +23,7 @@ import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
+import java.text.*;
import org.altusmetrum.altoslib_6.*;
import org.altusmetrum.altosuilib_6.*;
@@ -679,9 +680,13 @@ public class TeleGPS
if (args.length < i + 3) {
help(1);
} else {
- double lat = Double.parseDouble(args[i+1]);
- double lon = Double.parseDouble(args[i+2]);
+ try {
+ double lat = AltosParse.parse_double_locale(args[i+1]);
+ double lon = AltosParse.parse_double_locale(args[i+2]);
AltosUIMap.prefetch_maps(lat, lon);
+ } catch (ParseException e) {
+ System.out.printf("Can't parse number %s\n", e.toString());
+ }
i += 2;
}
} else if (args[i].equals("--replay"))
diff --git a/telegps/TeleGPSConfigUI.java b/telegps/TeleGPSConfigUI.java
index 97ab34b4..4e657586 100644
--- a/telegps/TeleGPSConfigUI.java
+++ b/telegps/TeleGPSConfigUI.java
@@ -17,6 +17,7 @@
package org.altusmetrum.telegps;
+import java.text.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@@ -686,7 +687,11 @@ public class TeleGPSConfigUI
String motion = tracker_motion_value.getSelectedItem().toString();
tracker_motion_label.setText(get_tracker_motion_label());
set_tracker_motion_values();
- set_tracker_motion((int) (AltosConvert.height.parse(motion, !imperial_units) + 0.5));
+ try {
+ int m = (int) (AltosConvert.height.parse_locale(motion, !imperial_units) + 0.5);
+ set_tracker_motion(m);
+ } catch (ParseException pe) {
+ }
}
if (!was_dirty)
set_clean();
@@ -886,7 +891,12 @@ public class TeleGPSConfigUI
}
public int tracker_motion() throws AltosConfigDataException {
- return (int) AltosConvert.height.parse(tracker_motion_value.getSelectedItem().toString());
+ String str = tracker_motion_value.getSelectedItem().toString();
+ try {
+ return (int) (AltosConvert.height.parse_locale(str) + 0.5);
+ } catch (ParseException pe) {
+ throw new AltosConfigDataException("invalid tracker motion %s", str);
+ }
}
public void set_tracker_interval(int tracker_interval) {