summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2020-08-04 16:42:55 -0500
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2020-08-04 16:42:55 -0500
commit618b81da627b55dcb051d889c7faffd91804497a (patch)
treedce77e602783c43514a09a53ae82f06f65a13bc0
parent77c7c962a6ed810b12685aa9ace4bd8a62761cea (diff)
Added scientific rounding.
-rw-r--r--src/org/unitConverter/converterGUI/UnitConverterGUI.java22
-rw-r--r--src/org/unitConverter/unit/LinearUnitValue.java23
-rw-r--r--src/org/unitConverter/unit/UnitDatabase.java18
3 files changed, 49 insertions, 14 deletions
diff --git a/src/org/unitConverter/converterGUI/UnitConverterGUI.java b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
index 8c70df4..f7c3479 100644
--- a/src/org/unitConverter/converterGUI/UnitConverterGUI.java
+++ b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
@@ -32,6 +32,7 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
+import java.util.NoSuchElementException;
import java.util.Set;
import java.util.function.Predicate;
@@ -270,14 +271,14 @@ final class UnitConverterGUI {
final Unit to;
try {
from = this.database.evaluateUnitExpression(fromUnitString);
- } catch (final IllegalArgumentException e) {
+ } catch (final IllegalArgumentException | NoSuchElementException e) {
this.view.showErrorDialog("Parse Error",
"Could not recognize text in From entry: " + e.getMessage());
return;
}
try {
to = this.database.getUnitFromExpression(toUnitString);
- } catch (final IllegalArgumentException e) {
+ } catch (final IllegalArgumentException | NoSuchElementException e) {
this.view.showErrorDialog("Parse Error",
"Could not recognize text in To entry: " + e.getMessage());
return;
@@ -304,9 +305,10 @@ final class UnitConverterGUI {
}
final LinearUnitValue converted = from2.convertTo(to2);
- this.view.setExpressionConverterOutputText(
- (useSlash ? "1 / " : "") + String.format("%s = %s",
- fromUnitString, this.getRoundedString(converted)));
+ this.view.setExpressionConverterOutputText((useSlash ? "1 / " : "")
+ + String.format("%s = %s", fromUnitString,
+ this.getRoundedString(converted, false)));
+ final String toString = this.getRoundedString(converted, false);
return;
} else {
// convert to UnitValue
@@ -384,18 +386,19 @@ final class UnitConverterGUI {
}
/**
- * Like {@link LinearUnitValue#toString(boolean)} with parameter
- * {@code false}, but obeys this unit converter's rounding settings.
+ * Like {@link LinearUnitValue#toString(boolean)}, but obeys this unit
+ * converter's rounding settings.
*
* @since 2020-08-04
*/
- private final String getRoundedString(final LinearUnitValue value) {
+ private final String getRoundedString(final LinearUnitValue value,
+ boolean showUncertainty) {
switch (this.roundingType) {
case DECIMAL_PLACES:
case SIGNIFICANT_DIGITS:
return this.getRoundedString(value.asUnitValue());
case SCIENTIFIC:
- return value.toString(false);
+ return value.toString(showUncertainty);
default:
throw new AssertionError("Invalid switch condition.");
}
@@ -992,7 +995,6 @@ final class UnitConverterGUI {
final JRadioButton relativePrecision = new JRadioButton(
"Scientific Precision");
- relativePrecision.setEnabled(false);
relativePrecision.addActionListener(e -> this.presenter
.setRoundingType(RoundingType.SCIENTIFIC));
roundingRuleButtons.add(relativePrecision);
diff --git a/src/org/unitConverter/unit/LinearUnitValue.java b/src/org/unitConverter/unit/LinearUnitValue.java
index 7096738..5685a6d 100644
--- a/src/org/unitConverter/unit/LinearUnitValue.java
+++ b/src/org/unitConverter/unit/LinearUnitValue.java
@@ -367,7 +367,7 @@ public final class LinearUnitValue {
final double baseUncertainty = this.unit.convertToBase(this.uncertainty);
// get rounded strings
- final String valueString, baseValueString, uncertaintyString,
+ String valueString, baseValueString, uncertaintyString,
baseUncertaintyString;
if (this.isExact()) {
valueString = Double.toString(this.value);
@@ -438,6 +438,27 @@ public final class LinearUnitValue {
return String.format("(%s ± %s) %s", valueString, uncertaintyString,
chosenName);
} else {
+ // truncate excess zeroes
+ if (valueString.contains(".")) {
+ while (valueString.endsWith("0")) {
+ valueString = valueString.substring(0, valueString.length() - 1);
+ }
+ if (valueString.endsWith(".")) {
+ valueString = valueString.substring(0, valueString.length() - 1);
+ }
+ }
+
+ if (baseValueString.contains(".")) {
+ while (baseValueString.endsWith("0")) {
+ baseValueString = baseValueString.substring(0,
+ baseValueString.length() - 1);
+ }
+ if (baseValueString.endsWith(".")) {
+ baseValueString = baseValueString.substring(0,
+ baseValueString.length() - 1);
+ }
+ }
+
if (primaryName.isEmpty() && symbol.isEmpty())
return String.format("%s unnamed unit (= %s %s)", valueString,
baseValueString, this.unit.getBase());
diff --git a/src/org/unitConverter/unit/UnitDatabase.java b/src/org/unitConverter/unit/UnitDatabase.java
index 0246630..c5432f7 100644
--- a/src/org/unitConverter/unit/UnitDatabase.java
+++ b/src/org/unitConverter/unit/UnitDatabase.java
@@ -21,6 +21,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
+import java.math.BigDecimal;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Arrays;
@@ -1465,7 +1466,7 @@ public final class UnitDatabase {
public LinearUnitValue evaluateUnitExpression(final String expression) {
Objects.requireNonNull(expression, "expression must not be null.");
- // attempt to get a unit as an alias first
+ // attempt to get a unit as an alias, or a number with precision first
if (this.containsUnitName(expression))
return this.getLinearUnitValue(expression);
@@ -1598,6 +1599,7 @@ public final class UnitDatabase {
} else {
// get a linear unit
final Unit unit = this.getUnit(name);
+
if (unit instanceof LinearUnit)
return (LinearUnit) unit;
else
@@ -1615,7 +1617,15 @@ public final class UnitDatabase {
* @since 2020-08-04
*/
private LinearUnitValue getLinearUnitValue(final String name) {
- return LinearUnitValue.getExact(this.getLinearUnit(name), 1);
+ try {
+ // try to parse it as a number - otherwise it is not a number!
+ final BigDecimal number = new BigDecimal(name);
+
+ final double uncertainty = Math.pow(10, -number.scale());
+ return LinearUnitValue.of(SI.ONE, number.doubleValue(), uncertainty);
+ } catch (final NumberFormatException e) {
+ return LinearUnitValue.getExact(this.getLinearUnit(name), 1);
+ }
}
/**
@@ -1682,7 +1692,9 @@ public final class UnitDatabase {
return SI.ONE.times(value);
} catch (final NumberFormatException e) {
final Unit unit = this.units.get(name);
- if (unit.getPrimaryName().isEmpty())
+ if (unit == null)
+ throw new NoSuchElementException("No unit " + name);
+ else if (unit.getPrimaryName().isEmpty())
return unit.withName(NameSymbol.ofName(name));
else if (!unit.getPrimaryName().get().equals(name)) {
final Set<String> otherNames = new HashSet<>(unit.getOtherNames());