Consolidating some to String methods in RocketScieence
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / RocketScience.java
index aed135bfd3b056f9a5349bac5c6d31b597f8dc9e..32343777e4873c41a1611cd7a1225dc77f9e3cb9 100644 (file)
@@ -1,7 +1,10 @@
 package com.billkuker.rocketry.motorsim;\r
 \r
+import java.text.DecimalFormat;\r
+import java.text.NumberFormat;\r
 import java.util.HashSet;\r
 import java.util.Set;\r
+import java.util.prefs.Preferences;\r
 \r
 import javax.measure.quantity.Pressure;\r
 import javax.measure.quantity.Quantity;\r
@@ -11,6 +14,8 @@ import javax.measure.unit.SI;
 import javax.measure.unit.Unit;\r
 import javax.measure.unit.UnitFormat;\r
 \r
+import org.jscience.physics.amount.Amount;\r
+\r
 public class RocketScience {\r
        public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));\r
        public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
@@ -31,36 +36,80 @@ public class RocketScience {
        public static enum UnitPreference{\r
                SI(new Unit[]{\r
                                javax.measure.unit.SI.MILLIMETER,\r
+                               javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND),\r
                                javax.measure.unit.SI.NEWTON,\r
                                javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),\r
                                NEWTON_SECOND\r
                }),\r
-               NonSI(new Unit[]{\r
+               NONSI(new Unit[]{\r
                                javax.measure.unit.NonSI.INCH,\r
                                javax.measure.unit.NonSI.POUND_FORCE,\r
+                               javax.measure.unit.NonSI.INCH.divide(javax.measure.unit.SI.SECOND),\r
                                PSI,\r
                                NEWTON_SECOND\r
                });\r
                \r
-               public static UnitPreference preference = NonSI;\r
+               private static UnitPreference preference = SI;\r
+\r
+               static {\r
+                       Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
+                       String p = prefs.get("PreferedUnits", "SI");\r
+                       preference = UnitPreference.valueOf(p);\r
+               }\r
+               \r
+               public static UnitPreference getUnitPreference(){\r
+                       return preference;\r
+               }\r
+               \r
+               public static void setUnitPreference( final UnitPreference up ){\r
+                       preference = up;\r
+                       Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
+                       prefs.put("PreferedUnits", up.toString());\r
+               }\r
                \r
                protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
                \r
-               UnitPreference( Unit u[] ){\r
-                       for ( Unit uu : u )\r
+               UnitPreference( Unit<?> u[] ){\r
+                       for ( Unit<?> uu : u )\r
                                units.add(uu);\r
                }\r
                \r
-               public Unit getPreferredUnit(Unit u){\r
+               @SuppressWarnings("unchecked")\r
+               public <T extends Quantity> Unit<T> getPreferredUnit(Unit<T> u){\r
                        if ( units.contains(u) )\r
                                return u;\r
-                       for( Unit ret : units ){\r
+                       for( Unit<?> ret : units ){\r
                                if ( ret.isCompatible(u) ){\r
-                                       return ret;\r
+                                       return (Unit<T>) ret;\r
                                }\r
                        }\r
                        return u;\r
                }\r
        }\r
 \r
+       public static <T extends Quantity> String ammountToString(Amount<T> a) {\r
+               final NumberFormat nf = new DecimalFormat("##########.###");\r
+               return nf.format(a.doubleValue(a.getUnit())) + " " + a.getUnit();\r
+       }\r
+       \r
+       public static <T extends Quantity> String ammountToRoundedString(Amount<T> a) {\r
+               if (a == null)\r
+                       return "NULL";\r
+               Unit<T> u = RocketScience.UnitPreference.preference.getPreferredUnit(a\r
+                               .getUnit());\r
+               double d = a.doubleValue(u);\r
+\r
+               DecimalFormat df;\r
+\r
+               if (Math.abs(d) < 10.0) {\r
+                       df = new DecimalFormat("#.##");\r
+               } else if (Math.abs(d) < 100.0) {\r
+                       df = new DecimalFormat("#.#");\r
+               } else {\r
+                       df = new DecimalFormat("#");\r
+               }\r
+\r
+               return df.format(d) + " " + u.toString();\r
+       }\r
+\r
 }\r