Fixed negative number bug in exp4j and custom expressions.

This commit is contained in:
Richard Graham 2012-08-17 06:21:37 +00:00
parent ceeade06b4
commit 22a81bc9be
2 changed files with 8 additions and 6 deletions

View File

@ -166,6 +166,7 @@ class Tokenizer {
Token lastToken; Token lastToken;
for (int i = 0; i < chars.length; i++) { for (int i = 0; i < chars.length; i++) {
char c = chars[i]; char c = chars[i];
if (c == ' ') if (c == ' ')
continue; continue;
if (isDigit(c)) { if (isDigit(c)) {
@ -179,12 +180,12 @@ class Tokenizer {
} }
i += numberLen - 1; i += numberLen - 1;
lastToken = new NumberToken(valueBuilder.toString()); lastToken = new NumberToken(valueBuilder.toString());
} else if (Character.isLetter(c) || c == '_' || c == '#') { } else if (Character.isLetter(c) || c == '_' || c == '$') {
// can be a variable or function // can be a variable or function
final StringBuilder nameBuilder = new StringBuilder(); final StringBuilder nameBuilder = new StringBuilder();
nameBuilder.append(c); nameBuilder.append(c);
int offset = 1; int offset = 1;
while (chars.length > i + offset && (Character.isLetter(chars[i + offset]) || Character.isDigit(chars[i + offset]) || chars[i + offset] == '_' || chars[i + offset] == '#')) { while (chars.length > i + offset && (Character.isLetter(chars[i + offset]) || Character.isDigit(chars[i + offset]) || chars[i + offset] == '_' || chars[i + offset] == '$')) {
nameBuilder.append(chars[i + offset++]); nameBuilder.append(chars[i + offset++]);
} }
String name = nameBuilder.toString(); String name = nameBuilder.toString();

View File

@ -204,7 +204,7 @@ public class CustomExpression implements Cloneable{
return false; return false;
// No bad characters // No bad characters
for (char c : "0123456789.,()[]{}<>:#@%^&* ".toCharArray()) for (char c : "0123456789.,()[]{}<>:#@%^&*$ ".toCharArray())
if (symbol.indexOf(c) != -1 ) if (symbol.indexOf(c) != -1 )
return false; return false;
@ -230,7 +230,7 @@ public class CustomExpression implements Cloneable{
return false; return false;
// No characters that could mess things up saving etc // No characters that could mess things up saving etc
for (char c : ",()[]{}<>#".toCharArray()) for (char c : ",()[]{}<>#$".toCharArray())
if (name.indexOf(c) != -1 ) if (name.indexOf(c) != -1 )
return false; return false;
@ -293,6 +293,7 @@ public class CustomExpression implements Cloneable{
} }
else break; else break;
case '#' : return false; case '#' : return false;
case '$' : return false;
case '=' : return false; case '=' : return false;
} }
} }
@ -465,12 +466,12 @@ public class CustomExpression implements Cloneable{
} }
/* /*
* Returns a simple all upper case string hash code with a proceeding # mark. * Returns a simple all upper case string hash code with a proceeding $ mark.
* Used for temporary substitution when evaluating index and range expressions. * Used for temporary substitution when evaluating index and range expressions.
*/ */
public String hash(){ public String hash(){
Integer hashint = new Integer(this.getExpressionString().hashCode()); Integer hashint = new Integer(this.getExpressionString().hashCode());
String hash = "#"; String hash = "$";
for (char c : hashint.toString().toCharArray()){ for (char c : hashint.toString().toCharArray()){
char newc = (char) (c + 17); char newc = (char) (c + 17);
hash = hash + newc; hash = hash + newc;