diff options
author | Adrien Hopkins <masterofnumbers17@gmail.com> | 2019-11-26 17:58:52 -0500 |
---|---|---|
committer | Adrien Hopkins <masterofnumbers17@gmail.com> | 2019-11-26 17:58:52 -0500 |
commit | 7a0f427727db7fcafd389e1e2c4b3ab207acd5c2 (patch) | |
tree | 185cfc2df4c2db275f14c57b96064ad186984213 | |
parent | a966676c629f7f14fcbba82a9ada5e2cbeca8314 (diff) |
Multiplication between a value and a unit now has precedence.
Example, 3 m / 2 s = (3 m) / (2 s)
This change also makes "3m" a valid expression.
-rw-r--r-- | src/org/unitConverter/unit/UnitDatabase.java | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/org/unitConverter/unit/UnitDatabase.java b/src/org/unitConverter/unit/UnitDatabase.java index 5985c80..6a89b67 100644 --- a/src/org/unitConverter/unit/UnitDatabase.java +++ b/src/org/unitConverter/unit/UnitDatabase.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Set; @@ -969,6 +970,21 @@ public final class UnitDatabase { } /** + * Replacements done to *all* expression types + */ + private static final Map<Pattern, String> EXPRESSION_REPLACEMENTS = new HashMap<>(); + + static { + // place brackets around any expression of the form "number unit", with or without the space + EXPRESSION_REPLACEMENTS.put(Pattern.compile("((?:-?[1-9]\\d*|0)" // integer + + "(?:\\.\\d+)?)" // optional decimal point with numbers after it + + "\\s*" // optional space(s) + + "([a-zA-Z]+)" // unit name + + "(?!-?\\d)" // no number directly afterwards (avoids matching "1e3") + ), "\\($1 $2\\)"); + } + + /** * A regular expression that separates names and expressions in unit files. */ private static final Pattern NAME_EXPRESSION = Pattern.compile("(\\S+)\\s+(\\S.*)"); @@ -1208,6 +1224,7 @@ public final class UnitDatabase { "Error at line %d: Lines of a unit file must consist of a unit name, then spaces or tabs, then a unit expression.", lineCounter)); final String name = lineMatcher.group(1); + final String expression = lineMatcher.group(2); if (name.endsWith(" ")) { @@ -1360,6 +1377,11 @@ public final class UnitDatabase { // fix broken spaces modifiedExpression = modifiedExpression.replaceAll(" +", " "); + // format expression + for (final Entry<Pattern, String> replacement : EXPRESSION_REPLACEMENTS.entrySet()) { + modifiedExpression = replacement.getKey().matcher(modifiedExpression).replaceAll(replacement.getValue()); + } + return this.unitDimensionParser.parseExpression(modifiedExpression); } @@ -1445,6 +1467,13 @@ public final class UnitDatabase { // fix broken spaces modifiedExpression = modifiedExpression.replaceAll(" +", " "); + // format expression + for (final Entry<Pattern, String> replacement : EXPRESSION_REPLACEMENTS.entrySet()) { + modifiedExpression = replacement.getKey().matcher(modifiedExpression).replaceAll(replacement.getValue()); + } + + System.out.println(modifiedExpression); + return this.prefixExpressionParser.parseExpression(modifiedExpression); } @@ -1507,11 +1536,16 @@ public final class UnitDatabase { // fix broken spaces modifiedExpression = modifiedExpression.replaceAll(" +", " "); + // format expression + for (final Entry<Pattern, String> replacement : EXPRESSION_REPLACEMENTS.entrySet()) { + modifiedExpression = replacement.getKey().matcher(modifiedExpression).replaceAll(replacement.getValue()); + } + // the previous operation breaks negative numbers, fix them! // (i.e. -2 becomes - 2) for (int i = 2; i < modifiedExpression.length(); i++) { if (modifiedExpression.charAt(i) == '-' - && Arrays.asList('+', '-', '*', '/', '^').contains(modifiedExpression.charAt(i - 2))) { + && (i < 2 || Arrays.asList('+', '-', '*', '/', '^').contains(modifiedExpression.charAt(i - 2)))) { // found a broken negative number modifiedExpression = modifiedExpression.substring(0, i + 1) + modifiedExpression.substring(i + 2); } |