X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosUnits.java;h=e119448767d024a07a962b73a2afff61bbf4cf66;hp=ee74f916f373342f8d0f72664598f8d1fbe91d1f;hb=a61217f0a6d0ef48b6471f632c4600255867e831;hpb=488a527267decece48e6682e0e0c7fc29cbed329 diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java index ee74f916..e1194487 100644 --- a/altoslib/AltosUnits.java +++ b/altoslib/AltosUnits.java @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,47 +16,207 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_2; +package org.altusmetrum.altoslib_12; + +import java.text.*; public abstract class AltosUnits { - public abstract double value(double v); + AltosUnitsRange[] range_metric, range_imperial; + + private AltosUnitsRange range(double v, boolean imperial_units) { + AltosUnitsRange[] ranges = imperial_units ? range_imperial : range_metric; + + for (int i = ranges.length - 1; i > 0; i--) + if (v >= ranges[i].lower_limit) + return ranges[i]; + return ranges[0]; + } + + private AltosUnitsRange first_range(boolean imperial_units) { + return imperial_units ? range_imperial[0] : range_metric[0]; + } + + public abstract double value(double v, boolean imperial_units); + + public abstract double inverse(double v, boolean imperial_units); + + public String string_value(double v, boolean imperial_units) { + return new Double(value(v, imperial_units)).toString(); + } + + public abstract String show_units(boolean imperial_units); - public abstract String show_units(); + public abstract String say_units(boolean imperial_units); - public abstract String say_units(); + public abstract int show_fraction(int width, boolean imperial_units); - public abstract int show_fraction(int width); + private double value(double v) { + return value(v, AltosConvert.imperial_units); + } + + private double inverse(double v) { + return inverse(v, AltosConvert.imperial_units); + } + + private String show_units() { + return show_units(AltosConvert.imperial_units); + } + + private String say_units() { + return say_units(AltosConvert.imperial_units); + } - int say_fraction() { + private int show_fraction(int width) { + return show_fraction(width, AltosConvert.imperial_units); + } + + private int say_fraction(boolean imperial_units) { return 0; } - private String show_format(int width) { - return String.format("%%%d.%df %s", width, show_fraction(width), show_units()); + private String show_format(AltosUnitsRange range, int width) { + return String.format("%%%d.%df %s", width, range.show_fraction(width), range.show_units); } - private String say_format() { - return String.format("%%1.%df", say_fraction()); + private String say_format(AltosUnitsRange range) { + return String.format("%%1.%df", range.say_fraction()); } - private String say_units_format() { - return String.format("%%1.%df %s", say_fraction(), say_units()); + private String say_units_format(AltosUnitsRange range) { + return String.format("%%1.%df %s", range.say_fraction(), range.say_units); } - public String graph_format(int width) { - return String.format(String.format("%%%d.%df", width, show_fraction(width)), 0.0); + public String show(int width, double v, boolean imperial_units) { + AltosUnitsRange range = range(v, imperial_units); + + return String.format(show_format(range, width), range.value(v)); + } + + public String say(double v, boolean imperial_units) { + AltosUnitsRange range = range(v, imperial_units); + + return String.format(say_format(range), range.value(v)); + } + + public String say_units(double v, boolean imperial_units) { + AltosUnitsRange range = range(v, imperial_units); + + return String.format(say_units_format(range), range.value(v)); } public String show(int width, double v) { - return String.format(show_format(width), value(v)); + return show(width, v, AltosConvert.imperial_units); } public String say(double v) { - return String.format(say_format(), value(v)); + return say(v, AltosConvert.imperial_units); } public String say_units(double v) { - return String.format(say_units_format(), value(v)); + return say_units(v, AltosConvert.imperial_units); + } + + public String string_value(double v) { + return string_value(v, AltosConvert.imperial_units); + } + + /* Parsing functions. Use the first range of the type */ + public String parse_units(boolean imperial_units) { + return first_range(imperial_units).show_units; + } + + public String parse_units() { + return parse_units(AltosConvert.imperial_units); + } + + public double parse_value(double v, boolean imperial_units) { + return first_range(imperial_units).value(v); + } + + public double parse_value(double v) { + return parse_value(v, AltosConvert.imperial_units); + } + + /* Graphing functions. Use the first range of the type */ + public String graph_units(boolean imperial_units) { + return first_range(imperial_units).show_units; + } + + public String graph_units() { + return graph_units(AltosConvert.imperial_units); + } + + public double graph_value(double v, boolean imperial_units) { + return first_range(imperial_units).value(v); + } + + public double graph_value(double v) { + return graph_value(v, AltosConvert.imperial_units); + } + + private String graph_format(AltosUnitsRange range, int width) { + return String.format(String.format("%%%d.%df", width, range.show_fraction(width)), 0.0); + } + + public String graph_format(int width, boolean imperial_units) { + return graph_format(first_range(imperial_units), width); + } + + public String graph_format(int width) { + return graph_format(width, AltosConvert.imperial_units); + } + + /* Parsing functions. */ + 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_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 AltosUnits() { + range_metric = new AltosUnitsRange[1]; + + range_metric[0] = new AltosUnitsRange(this, false) { + double value(double v) { + return units.value(v, false); + } + + int show_fraction(int width) { + return units.show_fraction(width, false); + } + + int say_fraction() { + return units.say_fraction(false); + } + }; + + range_imperial = new AltosUnitsRange[1]; + + range_imperial[0] = new AltosUnitsRange(this, true) { + double value(double v) { + return units.value(v, true); + } + + int show_fraction(int width) { + return units.show_fraction(width, true); + } + + int say_fraction() { + return units.say_fraction(true); + } + }; } -} \ No newline at end of file +}