diff --git a/app/src/main/java/org/solovyev/android/calculator/BaseNumberBuilder.java b/app/src/main/java/org/solovyev/android/calculator/BaseNumberBuilder.java index de8783a1..6546afd3 100644 --- a/app/src/main/java/org/solovyev/android/calculator/BaseNumberBuilder.java +++ b/app/src/main/java/org/solovyev/android/calculator/BaseNumberBuilder.java @@ -77,7 +77,7 @@ public abstract class BaseNumberBuilder { if ("−".equals(match) || "-".equals(match) || "+".equals(match)) { final StringBuilder localNb = numberBuilder; if (localNb != null && localNb.length() > 0) { - if (localNb.charAt(localNb.length() - 1) == MathType.POWER_10) { + if (localNb.charAt(localNb.length() - 1) == MathType.EXPONENT) { return true; } } diff --git a/app/src/main/java/org/solovyev/android/calculator/NumberBuilder.java b/app/src/main/java/org/solovyev/android/calculator/NumberBuilder.java index e506e435..01e1ea9a 100644 --- a/app/src/main/java/org/solovyev/android/calculator/NumberBuilder.java +++ b/app/src/main/java/org/solovyev/android/calculator/NumberBuilder.java @@ -26,7 +26,6 @@ import android.text.SpannableStringBuilder; import jscl.MathContext; import jscl.MathEngine; import jscl.NumeralBase; -import jscl.math.numeric.Real; import jscl.text.DoubleParser; import jscl.text.JsclIntegerParser; import jscl.text.ParseException; @@ -45,60 +44,23 @@ public class NumberBuilder extends BaseNumberBuilder { } private static int replaceNumberInText(@Nonnull SpannableStringBuilder sb, - @Nullable String number, + @Nullable String oldNumber, int trimmedChars, @Nonnull NumeralBase nb, @Nonnull final MathEngine engine) { - if (number == null) { + if (oldNumber == null) { return 0; } // in any case remove old number from text - final int oldNumberLength = number.length() + trimmedChars; + final int oldNumberLength = oldNumber.length() + trimmedChars; sb.delete(sb.length() - oldNumberLength, sb.length()); - final String newNumber = formatNumber(number, nb, engine); + final String newNumber = engine.format(oldNumber, nb); sb.append(newNumber); // offset between old number and new number return newNumber.length() - oldNumberLength; } - @Nonnull - private static String formatNumber(@Nonnull String number, @Nonnull NumeralBase nb, @Nonnull MathEngine engine) { - String result; - - int indexOfDot = number.indexOf('.'); - - if (indexOfDot < 0) { - int indexOfE; - if (nb == NumeralBase.hex) { - indexOfE = -1; - } else { - indexOfE = number.indexOf(MathType.POWER_10); - } - if (indexOfE < 0) { - result = engine.addGroupingSeparators(nb, number); - } else { - final String partBeforeE; - if (indexOfE != 0) { - partBeforeE = engine.addGroupingSeparators(nb, number.substring(0, indexOfE)); - } else { - partBeforeE = ""; - } - result = partBeforeE + number.substring(indexOfE); - } - } else { - final String integerPart; - if (indexOfDot != 0) { - integerPart = engine.addGroupingSeparators(nb, number.substring(0, indexOfDot)); - } else { - integerPart = ""; - } - result = integerPart + number.substring(indexOfDot); - } - - return result; - } - @Nonnull private static Double toDouble(@Nonnull String s, @Nonnull NumeralBase nb, @Nonnull final MathContext mc) throws NumberFormatException { final NumeralBase defaultNb = mc.getNumeralBase(); @@ -112,7 +74,7 @@ public class NumberBuilder extends BaseNumberBuilder { p.exceptionsPool.release(e); try { p.reset(); - return ((Real) DoubleParser.parser.parse(p, null).content()).doubleValue(); + return DoubleParser.parser.parse(p, null).content().doubleValue(); } catch (ParseException e1) { p.exceptionsPool.release(e1); throw new NumberFormatException(); diff --git a/app/src/main/java/org/solovyev/android/calculator/math/MathType.java b/app/src/main/java/org/solovyev/android/calculator/math/MathType.java index d4c12250..89e464a9 100644 --- a/app/src/main/java/org/solovyev/android/calculator/math/MathType.java +++ b/app/src/main/java/org/solovyev/android/calculator/math/MathType.java @@ -23,24 +23,21 @@ package org.solovyev.android.calculator.math; import android.support.annotation.NonNull; - +import jscl.JsclMathEngine; +import jscl.NumeralBase; +import jscl.math.function.Constants; import org.solovyev.android.Check; import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.Engine; import org.solovyev.android.calculator.ParseException; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import jscl.JsclMathEngine; -import jscl.NumeralBase; -import jscl.math.function.Constants; - public enum MathType { @@ -224,7 +221,7 @@ public enum MathType { }; public static final List groupSymbols = Arrays.asList("()", "[]", "{}"); - public final static Character POWER_10 = 'E'; + public final static Character EXPONENT = 'E'; public static final String E = "e"; public static final String C = "c"; public final static String NAN = "NaN"; diff --git a/jscl/src/main/java/jscl/JsclMathEngine.java b/jscl/src/main/java/jscl/JsclMathEngine.java index 6c26d3d9..17950a19 100644 --- a/jscl/src/main/java/jscl/JsclMathEngine.java +++ b/jscl/src/main/java/jscl/JsclMathEngine.java @@ -2,7 +2,6 @@ package jscl; import jscl.math.Expression; import jscl.math.Generic; -import jscl.math.NotIntegerException; import jscl.math.function.*; import jscl.math.operator.Operator; import jscl.math.operator.Percent; @@ -16,7 +15,6 @@ import org.solovyev.common.msg.Messages; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.math.BigDecimal; import java.math.BigInteger; import java.util.List; @@ -27,7 +25,6 @@ public class JsclMathEngine implements MathEngine { public static final AngleUnit DEFAULT_ANGLE_UNITS = AngleUnit.deg; public static final NumeralBase DEFAULT_NUMERAL_BASE = NumeralBase.dec; public static final char GROUPING_SEPARATOR_DEFAULT = ' '; - public static final int MAX_FRACTION_DIGITS = 20; @Nonnull private static JsclMathEngine instance = new JsclMathEngine(); @Nonnull @@ -59,14 +56,6 @@ public class JsclMathEngine implements MathEngine { return instance; } - private static int integerValue(final double value) throws NotIntegerException { - if (Math.floor(value) == value) { - return (int) value; - } else { - throw NotIntegerException.get(); - } - } - @Nonnull public String evaluate(@Nonnull String expression) throws ParseException { return evaluateGeneric(expression).toString(); @@ -246,21 +235,6 @@ public class JsclMathEngine implements MathEngine { return null; } - @Nonnull - public String convert(@Nonnull Double value, @Nonnull NumeralBase to) { - String ungroupedValue; - try { - // check if double can be converted to integer - integerValue(value); - - ungroupedValue = to.toString(new BigDecimal(value).toBigInteger()); - } catch (NotIntegerException e) { - ungroupedValue = to.toString(value, roundResult ? precision : MAX_FRACTION_DIGITS); - } - - return addGroupingSeparators(to, ungroupedValue); - } - @Nonnull public MessageRegistry getMessageRegistry() { return messageRegistry; @@ -271,32 +245,35 @@ public class JsclMathEngine implements MathEngine { } @Nonnull - public String addGroupingSeparators(@Nonnull NumeralBase nb, @Nonnull String ungroupedDoubleValue) { - if (useGroupingSeparator) { - final String groupingSeparator = getGroupingSeparator(nb); - - final int dotIndex = ungroupedDoubleValue.indexOf("."); - - String ungroupedValue; - if (dotIndex >= 0) { - ungroupedValue = ungroupedDoubleValue.substring(0, dotIndex); - } else { - ungroupedValue = ungroupedDoubleValue; - } - // inject group separator in the resulted string - // NOTE: space symbol is always used!!! - StringBuilder result = insertSeparators(nb, groupingSeparator, ungroupedValue, true); - - result = result.reverse(); - - if (dotIndex >= 0) { - result.append(insertSeparators(nb, groupingSeparator, ungroupedDoubleValue.substring(dotIndex), false)); - } - - return result.toString(); - } else { - return ungroupedDoubleValue; + @Override + public String format(@Nonnull String value, @Nonnull NumeralBase nb) { + if (!useGroupingSeparator) { + return value; } + final int dot = value.indexOf('.'); + if (dot >= 0) { + final String intPart = dot != 0 ? insertSeparators(value.substring(0, dot), nb) : ""; + return intPart + value.substring(dot); + } + final int e = nb == NumeralBase.hex ? -1 : value.indexOf('E'); + if (e >= 0) { + final String intPart = e != 0 ? insertSeparators(value.substring(0, e), nb) : ""; + return intPart + value.substring(e); + } + return insertSeparators(value, nb); + } + + @Nonnull + public String insertSeparators(@Nonnull String value, @Nonnull NumeralBase nb) { + final String separator = getGroupingSeparator(nb); + final StringBuilder result = new StringBuilder(value.length() + nb.getGroupingSize() * separator.length()); + for (int i = value.length() - 1; i >= 0; i--) { + result.append(value.charAt(i)); + if (i != 0 && (value.length() - i) % nb.getGroupingSize() == 0) { + result.append(separator); + } + } + return result.reverse().toString(); } @Nonnull @@ -308,32 +285,6 @@ public class JsclMathEngine implements MathEngine { return nb == NumeralBase.dec ? groupingSeparator : ' '; } - @Nonnull - private StringBuilder insertSeparators(@Nonnull NumeralBase nb, - @Nonnull String groupingSeparator, - @Nonnull String value, - boolean reversed) { - final StringBuilder result = new StringBuilder(value.length() + nb.getGroupingSize() * groupingSeparator.length()); - - if (reversed) { - for (int i = value.length() - 1; i >= 0; i--) { - result.append(value.charAt(i)); - if (i != 0 && (value.length() - i) % nb.getGroupingSize() == 0) { - result.append(groupingSeparator); - } - } - } else { - for (int i = 0; i < value.length(); i++) { - result.append(value.charAt(i)); - if (i != 0 && i != value.length() - 1 && i % nb.getGroupingSize() == 0) { - result.append(groupingSeparator); - } - } - } - - return result; - } - public void setRoundResult(boolean roundResult) { this.roundResult = roundResult; } diff --git a/jscl/src/main/java/jscl/MathContext.java b/jscl/src/main/java/jscl/MathContext.java index 4f280149..83e64bb4 100644 --- a/jscl/src/main/java/jscl/MathContext.java +++ b/jscl/src/main/java/jscl/MathContext.java @@ -53,7 +53,7 @@ public interface MathContext { String format(double value, @Nonnull NumeralBase nb); @Nonnull - String addGroupingSeparators(@Nonnull NumeralBase nb, @Nonnull String ungroupedIntValue); + String format(@Nonnull String value, @Nonnull NumeralBase nb); void setScienceNotation(boolean scienceNotation); } diff --git a/jscl/src/main/java/jscl/MathEngine.java b/jscl/src/main/java/jscl/MathEngine.java index a082c9a5..e2412c13 100644 --- a/jscl/src/main/java/jscl/MathEngine.java +++ b/jscl/src/main/java/jscl/MathEngine.java @@ -26,9 +26,6 @@ public interface MathEngine extends MathContext { @Nonnull Generic elementaryGeneric(@Nonnull String expression) throws ParseException; - @Nonnull - String convert(@Nonnull Double value, @Nonnull NumeralBase to); - @Nonnull MessageRegistry getMessageRegistry();