summaryrefslogtreecommitdiff
path: root/src/main/java/sevenUnitsGUI/Presenter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/sevenUnitsGUI/Presenter.java')
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java56
1 files changed, 45 insertions, 11 deletions
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index 981af21..85a0ddc 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -242,6 +242,9 @@ public final class Presenter {
throw new AssertionError("Loading of metric_exceptions.txt failed.",
e);
}
+
+ // set default settings temporarily
+ this.numberDisplayRule = StandardDisplayRules.uncertaintyBased();
}
/**
@@ -293,9 +296,21 @@ public final class Presenter {
// convert and show output
if (from.getUnit().canConvertTo(to)) {
- final double value = from.asUnitValue().convertTo(to).getValue();
+ final UncertainDouble uncertainValue;
+
+ // uncertainty is meaningless for non-linear units, so we will have
+ // to erase uncertainty information for them
+ if (to instanceof LinearUnit) {
+ final var toLinear = (LinearUnit) to;
+ uncertainValue = from.convertTo(toLinear).getValue();
+ } else {
+ final double value = from.asUnitValue().convertTo(to).getValue();
+ uncertainValue = UncertainDouble.of(value, 0);
+ }
+
final UnitConversionRecord uc = UnitConversionRecord.valueOf(
- fromExpression, toExpression, "", String.valueOf(value));
+ fromExpression, toExpression, "",
+ this.numberDisplayRule.apply(uncertainValue));
xcview.showExpressionConversionOutput(uc);
} else {
this.view.showErrorMessage("Conversion Error",
@@ -324,7 +339,7 @@ public final class Presenter {
final Optional<String> fromUnitOptional = ucview.getFromSelection();
final Optional<String> toUnitOptional = ucview.getToSelection();
- final String valueString = ucview.getInputValue();
+ final String inputValueString = ucview.getInputValue();
// extract values from optionals
final String fromUnitString, toUnitString;
@@ -345,7 +360,7 @@ public final class Presenter {
// convert strings to data, checking if anything is invalid
final Unit fromUnit, toUnit;
- final double value;
+ final UncertainDouble uncertainValue;
if (this.database.containsUnitName(fromUnitString)) {
fromUnit = this.database.getUnit(fromUnitString);
@@ -356,23 +371,42 @@ public final class Presenter {
} else
throw this.viewError("Nonexistent To unit: %s", toUnitString);
try {
- value = Double.parseDouble(valueString);
+ uncertainValue = UncertainDouble
+ .fromRoundedString(inputValueString);
} catch (final NumberFormatException e) {
this.view.showErrorMessage("Value Error",
- "Invalid value " + valueString);
+ "Invalid value " + inputValueString);
return;
}
if (!fromUnit.canConvertTo(toUnit))
throw this.viewError("Could not convert between %s and %s",
fromUnit, toUnit);
-
- // convert!
- final UnitValue initialValue = UnitValue.of(fromUnit, value);
- final UnitValue converted = initialValue.convertTo(toUnit);
+
+ // convert - we will need to erase uncertainty for non-linear units, so
+ // we need to treat linear and non-linear units differently
+ final String outputValueString;
+ if (fromUnit instanceof LinearUnit && toUnit instanceof LinearUnit) {
+ final LinearUnit fromLinear = (LinearUnit) fromUnit;
+ final LinearUnit toLinear = (LinearUnit) toUnit;
+ final LinearUnitValue initialValue = LinearUnitValue.of(fromLinear,
+ uncertainValue);
+ final LinearUnitValue converted = initialValue.convertTo(toLinear);
+
+ outputValueString = this.numberDisplayRule
+ .apply(converted.getValue());
+ } else {
+ final UnitValue initialValue = UnitValue.of(fromUnit,
+ uncertainValue.value());
+ final UnitValue converted = initialValue.convertTo(toUnit);
+
+ outputValueString = this.numberDisplayRule
+ .apply(UncertainDouble.of(converted.getValue(), 0));
+ }
ucview.showUnitConversionOutput(
- UnitConversionRecord.fromValues(initialValue, converted));
+ UnitConversionRecord.valueOf(fromUnitString, toUnitString,
+ inputValueString, outputValueString));
} else
throw new UnsupportedOperationException(
"This function can only be called when the view is a UnitConversionView.");