support for entering E number

This commit is contained in:
serso
2011-11-12 18:49:26 +04:00
parent bf95c5da7e
commit 4428e6a392
6 changed files with 76 additions and 40 deletions

View File

@@ -43,12 +43,7 @@ public enum MathType {
}
},
power_10(300, true, false, "E") {
@Override
protected String getSubstituteToJscl(@NotNull String match) {
return POWER_10_JSCL;
}
},
power_10(300, false, false, "E"),
postfix_function(400, false, true) {
@NotNull
@@ -260,7 +255,6 @@ public enum MathType {
public static final List<String> openGroupSymbols = Arrays.asList("[]", "()", "{}");
public final static Character POWER_10 = 'E';
public final static String POWER_10_JSCL = "10^";
public static final String IMAGINARY_NUMBER = "i";
public static final String IMAGINARY_NUMBER_JSCL = "√(-1)";

View File

@@ -13,11 +13,14 @@ import org.solovyev.common.utils.CollectionsUtils;
import org.solovyev.common.utils.Finder;
import org.solovyev.common.utils.MutableObject;
import java.util.ArrayList;
import java.util.List;
/**
* User: serso
* Date: 10/23/11
* Time: 2:57 PM
*/
* User: serso
* Date: 10/23/11
* Time: 2:57 PM
*/
public class NumberBuilder {
@Nullable
@@ -36,7 +39,8 @@ public class NumberBuilder {
number = null;
final MathType.Result possibleResult;
if (CollectionsUtils.contains(mathTypeResult.getMathType(), MathType.digit, MathType.dot, MathType.grouping_separator, MathType.power_10)) {
if (CollectionsUtils.contains(mathTypeResult.getMathType(), MathType.digit, MathType.dot, MathType.grouping_separator, MathType.power_10) ||
isSignAfterE(mathTypeResult)) {
if (numberBuilder == null) {
numberBuilder = new StringBuilder();
}
@@ -51,17 +55,31 @@ public class NumberBuilder {
return possibleResult == null ? mathTypeResult : possibleResult;
}
private boolean isSignAfterE(@NotNull MathType.Result mathTypeResult) {
if ("-".equals(mathTypeResult.getMatch()) || "+".equals(mathTypeResult.getMatch())) {
if (numberBuilder != null && numberBuilder.length() > 0) {
if (numberBuilder.charAt(numberBuilder.length() - 1) == MathType.POWER_10) {
return true;
}
}
}
return false;
}
@Nullable
public MathType.Result process(@NotNull StringBuilder sb, @Nullable MutableObject<Integer> numberOffset) {
int numberOfGroupingSeparators = 0;
int numberOfTokens = 0;
if (numberBuilder != null) {
try {
number = numberBuilder.toString();
for (String groupingSeparator : MathType.grouping_separator.getTokens()) {
List<String> tokens = new ArrayList<String>();
tokens.addAll(MathType.grouping_separator.getTokens());
tokens.add("+");
for (String groupingSeparator : tokens) {
String newNumber = number.replace(groupingSeparator, "");
numberOfGroupingSeparators += number.length() - newNumber.length();
numberOfTokens += number.length() - newNumber.length();
number = newNumber;
}
Double.valueOf(number);
@@ -74,11 +92,11 @@ public class NumberBuilder {
number = null;
}
return replaceSystemVars(sb, number, numberOfGroupingSeparators, numberOffset);
return replaceSystemVars(sb, number, numberOfTokens, numberOffset);
}
@Nullable
private MathType.Result replaceSystemVars(StringBuilder sb, String number, int numberOfGroupingSeparators, @Nullable MutableObject<Integer> numberOffset) {
private MathType.Result replaceSystemVars(StringBuilder sb, String number, int numberOfTokens, @Nullable MutableObject<Integer> numberOffset) {
MathType.Result result = null;
if (number != null) {
@@ -91,11 +109,11 @@ public class NumberBuilder {
});
if (var != null) {
sb.delete(sb.length() - number.length() - numberOfGroupingSeparators, sb.length());
sb.delete(sb.length() - number.length() - numberOfTokens, sb.length());
sb.append(var.getName());
result = new MathType.Result(MathType.constant, var.getName());
} else {
sb.delete(sb.length() - number.length() - numberOfGroupingSeparators, sb.length());
sb.delete(sb.length() - number.length() - numberOfTokens, sb.length());
final String formattedNumber;
@@ -103,9 +121,20 @@ public class NumberBuilder {
int indexOfDot = number.indexOf('.');
if (indexOfDot < 0) {
formattedNumber = CalculatorEngine.instance.format(Double.valueOf(number), false);
int indexOfE = number.indexOf('E');
if (indexOfE < 0) {
formattedNumber = CalculatorEngine.instance.format(Double.valueOf(number), false);
} else {
final String part;
if (indexOfDot != 0) {
part = CalculatorEngine.instance.format(Double.valueOf(number.substring(0, indexOfE)), false);
} else {
part = "";
}
formattedNumber = part + number.substring(indexOfE);
}
} else {
String integerPart = null;
final String integerPart;
if (indexOfDot != 0) {
integerPart = CalculatorEngine.instance.format(Double.valueOf(number.substring(0, indexOfDot)), false);
} else {
@@ -118,7 +147,7 @@ public class NumberBuilder {
}
if (numberOffset != null) {
numberOffset.setObject(formattedNumber.length() - number.length() - numberOfGroupingSeparators);
numberOffset.setObject(formattedNumber.length() - number.length() - numberOfTokens);
}
sb.append(formattedNumber);
}