Skip to content

Commit

Permalink
add more units, and improved unit output
Browse files Browse the repository at this point in the history
  • Loading branch information
nhirokinet committed Sep 12, 2021
1 parent 60e4cdd commit 27ca599
Show file tree
Hide file tree
Showing 12 changed files with 980 additions and 116 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
/.idea/libraries
/.idea/compiler.xml
/.idea/jarRepositories.xml
/.idea/deploymentTargetDropDown.xml
.DS_Store
/build
/captures
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.util.Pair;

import net.nhiroki.bluelineconsole.R;
import net.nhiroki.bluelineconsole.commands.calculator.Calculator;
Expand Down Expand Up @@ -50,33 +51,33 @@ public void waitUntilPrepared() {}

private static class CalculatorCandidateEntry implements CandidateEntry {
private final String title;
private String resultText;
private String subText;
private List <Pair<String, String>> results;

CalculatorCandidateEntry(String s, Context context) {
char ltr = 0x200e;
title = ltr + s;
this.results = new ArrayList<>();

final char ltr = 0x200e;
this.title = ltr + s;

try {
CalculatorNumber res = Calculator.calculate(s);
resultText = ltr + "= " + res.generateFinalString();
subText = String.format(context.getString(R.string.calculator_precision_format), getPrecisionText(context, res.getPrecision()));
List<CalculatorNumber> res = Calculator.calculate(s);
for (CalculatorNumber r: res) {
this.results.add(new Pair<String, String>(ltr + (r.getPrecision() == CalculatorNumber.Precision.PRECISION_NO_ERROR ? "= " : "≒ ") + r.generateFinalString(),
String.format(context.getString(R.string.calculator_precision_format), getPrecisionText(context, r.getPrecision()))));
}

} catch (CalculatorExceptions.UnitConversionException e) {
resultText = String.format(context.getString(R.string.calculator_error_unit_conversion_failure), e.getFrom().calculateDisplayName(), e.getTo().calculateDisplayName());
subText = null;
this.results.add(new Pair<String, String>(String.format(context.getString(R.string.calculator_error_unit_conversion_failure), e.getFrom().calculateDisplayName(), e.getTo().calculateDisplayName()), null));

} catch (CalculatorExceptions.IllegalFormulaException e) {
resultText = "= ...";
subText = null;
this.results.add(new Pair<String, String>("= ...", null));

} catch (CalculatorExceptions.DivisionByZeroException e) {
resultText = context.getString(R.string.calculator_error_division_by_zero);
subText = null;
this.results.add(new Pair<String, String>(context.getString(R.string.calculator_error_division_by_zero), null));

} catch (CalculatorExceptions.CalculationException e) {
} catch (Exception e) {
// Keep this function new not to happen this error
resultText = "Unknown calculation error";
subText = null;
this.results.add(new Pair<String, String>(context.getString(R.string.error_calculator_internal_error), e.toString()));
}
}

Expand All @@ -97,23 +98,25 @@ public View getView(Context context) {
ret.setOrientation(LinearLayout.VERTICAL);
ret.setTextDirection(View.TEXT_DIRECTION_LTR);

TextView resultView = new TextView(context);
for (Pair<String, String> r: this.results) {
TextView resultView = new TextView(context);

TypedValue baseTextColor = new TypedValue();
context.getTheme().resolveAttribute(R.attr.bluelineconsoleBaseTextColor, baseTextColor, true);
TypedValue baseTextColor = new TypedValue();
context.getTheme().resolveAttribute(R.attr.bluelineconsoleBaseTextColor, baseTextColor, true);

resultView.setText(resultText);
resultView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 60);
resultView.setTypeface(null, Typeface.BOLD);
resultView.setTextColor(baseTextColor.data);
resultView.setText(r.first);
resultView.setTextSize(TypedValue.COMPLEX_UNIT_SP, r.first.length() < 16 ? 60 : 36);
resultView.setTypeface(null, Typeface.BOLD);
resultView.setTextColor(baseTextColor.data);

ret.addView(resultView);
ret.addView(resultView);

if (subText != null) {
TextView precisionView = new TextView(context);
precisionView.setText(subText);
precisionView.setTypeface(null, Typeface.BOLD);
ret.addView(precisionView);
if (r.second != null) {
TextView precisionView = new TextView(context);
precisionView.setText(r.second);
precisionView.setTypeface(null, Typeface.BOLD);
ret.addView(precisionView);
}
}

return ret;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
import net.nhiroki.bluelineconsole.commands.calculator.units.UnitDirectory;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Calculator {
public static CalculatorNumber calculate(String expression) throws CalculatorExceptions.IllegalFormulaException, CalculatorExceptions.CalculationException {
public static List<CalculatorNumber> calculate(String expression) throws CalculatorExceptions.IllegalFormulaException, CalculatorExceptions.CalculationException {
CombinedUnit finalUnit = null;

String[] split_expression = expression.split(" ");
Expand All @@ -16,14 +18,15 @@ public static CalculatorNumber calculate(String expression) throws CalculatorExc
String[] unitnameSplit = split_expression[split_expression.length - 1].split("/");

if (unitnameSplit.length == 1) {
finalUnit = UnitDirectory.getInstance().getCombinedUnitFromName(unitnameSplit[0]);
finalUnit = UnitDirectory.getInstance().getCombinedUnitFromName(unitnameSplit[0]).explicitCombinedUnit();
expression = "";
for (int i = 0; i < split_expression.length - 2; ++i) {
expression += split_expression[i] + " ";
}
}
if (unitnameSplit.length == 2) {
finalUnit = UnitDirectory.getInstance().getCombinedUnitFromName(unitnameSplit[0]).divide(UnitDirectory.getInstance().getCombinedUnitFromName(unitnameSplit[1]));
CombinedUnit positive = unitnameSplit[0].isEmpty() ? new CombinedUnit() : UnitDirectory.getInstance().getCombinedUnitFromName(unitnameSplit[0]).explicitCombinedUnit();
finalUnit = positive.divide(UnitDirectory.getInstance().getCombinedUnitFromName(unitnameSplit[1])).explicitCombinedUnit();
expression = "";
for (int i = 0; i < split_expression.length - 2; ++i) {
expression += split_expression[i] + " ";
Expand All @@ -40,9 +43,17 @@ public static CalculatorNumber calculate(String expression) throws CalculatorExc
if (finalUnit != null) {
result = result.convertUnit(finalUnit);
}
result = result.generateFinalDecimalValue();
List <CalculatorNumber> ret = new ArrayList<>();
ret.add(result.generateFinalDecimalValue());

return result;
if (finalUnit == null) {
CalculatorNumber secondary = result.generatePossiblyPreferredOutputValue();
if (secondary != null) {
ret.add(secondary);
}
}

return ret;
}

throw new CalculatorExceptions.IllegalFormulaException();
Expand Down Expand Up @@ -83,7 +94,7 @@ private static int skipSpaces(final String expressions, final int start) {
return ret;
}

private static ParseResult readFormulaPart(String expression, final int start) throws CalculatorExceptions.IllegalFormulaException {
private static ParseResult readFormulaPart(String expression, final int start) throws CalculatorExceptions.IllegalFormulaException, CalculatorExceptions.CalculationException {
if (start >= expression.length()) {
throw new CalculatorExceptions.IllegalFormulaException();
}
Expand Down Expand Up @@ -155,7 +166,7 @@ private static ParseResult readFormulaPart(String expression, final int start) t
}
CombinedUnit unit = null;
if (! unitname.isEmpty()) {
unit = UnitDirectory.getInstance().getCombinedUnitFromName(unitname);
unit = UnitDirectory.getInstance().getCombinedUnitFromName(unitname).explicitCombinedUnitIfSingle();
}
if (! unitname.isEmpty() && curpos < expression.length() - 1 && expression.charAt(curpos) == '/') {
String unitname2 = "";
Expand All @@ -166,7 +177,7 @@ private static ParseResult readFormulaPart(String expression, final int start) t

if (! unitname2.isEmpty()) {
try {
CombinedUnit unit2 = UnitDirectory.getInstance().getCombinedUnitFromName(unitname2);
CombinedUnit unit2 = UnitDirectory.getInstance().getCombinedUnitFromName(unitname2).explicitCombinedUnitIfSingle();
unit = unit.divide(unit2);
curpos = tmpcurpos;
} catch (CalculatorExceptions.IllegalFormulaException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,18 @@
import net.nhiroki.bluelineconsole.commands.calculator.units.CombinedUnit;

public class CalculatorExceptions {
public static class PrecisionNotAchievableException extends Exception {}
public static class IllegalFormulaException extends Exception {}
public static class CalculationException extends Exception {}
public static class CalculationException extends Exception {
String error_message = "";
public CalculationException() {}
public CalculationException(String error_message) {
this.error_message = error_message;
}

public String toString() {
return this.getClass().getSimpleName() + ": " + this.error_message;
}
}
public static class DivisionByZeroException extends CalculationException {}
public static class UnitConversionException extends CalculationException {
private final CombinedUnit from;
Expand All @@ -18,7 +27,7 @@ public UnitConversionException(CombinedUnit from, CombinedUnit to) {

@Override
public String toString() {
return "UnitConversionException (from: " + this.from.toString() + ", to: " + this.to.toString() + ")";
return "Failed to convert unit from " + this.from.toString() + " to " + this.to.toString() + ")";
}

public CombinedUnit getFrom() {
Expand Down
Loading

0 comments on commit 27ca599

Please sign in to comment.