将平方根和退格按钮添加到 Java 代码
Adding Square Root and Backspace Button to Java Code
你能不能看看我的代码并帮助我在我的项目中添加平方根 (√) 百分比 (%) 和退格 (<-) 按钮。
我认为问题出在 CalcUtils Java 代码上,如果您愿意,我还可以添加 MainActivity.java 和 activity_main.xml 文件。
public final class CalcUtils {
private CalcUtils(){
}
public static boolean isOperator(char c){
return c == '/' ||
c == '÷' ||
c == '*' ||
c == '-' ||
c == '+';
}
public static double evaluate(final String str){
class Parser {
int pos = -1, c;
void eatChar() {
c = (++pos < str.length()) ? str.charAt(pos) : -1;
}
void eatSpace() {
while (Character.isWhitespace(c)) eatChar();
}
double parse() {
eatChar();
double v = parseExpression();
if (c != -1) throw new RuntimeException("Unexpected: " + (char)c);
return v;
}
// Grammar:
// expression = term | expression `+` term | expression `-` term
// term = factor | term `*` factor | term `/` factor | term brackets
// factor = brackets | number | factor `^` factor
// brackets = `(` expression `)`
double parseExpression() {
double v = parseTerm();
for (;;) {
eatSpace();
if (c == '+') { // addition
eatChar();
v += parseTerm();
} else if (c == '-') { // subtraction
eatChar();
v -= parseTerm();
} else {
return v;
}
}
}
double parseTerm() {
double v = parseFactor();
for (;;) {
eatSpace();
if (c == '/' || c == '÷') { // division
eatChar();
v /= parseFactor();
} else if (c == '*' || c == '(') { // multiplication
if (c == '*') eatChar();
v *= parseFactor();
} else {
return v;
}
}
}
double parseFactor() {
double v;
boolean negate = false;
eatSpace();
if (c == '+' || c == '-') { // unary plus & minus
negate = c == '-';
eatChar();
eatSpace();
}
if (c == '(') { // brackets
eatChar();
v = parseExpression();
if (c == ')') eatChar();
} else { // numbers
int startIndex = this.pos;
while ((c >= '0' && c <= '9') || c == '.') eatChar();
if (pos == startIndex) throw new RuntimeException("Unexpected: " + (char)c);
v = Double.parseDouble(str.substring(startIndex, pos));
}
eatSpace();
if (c == '^') { // exponentiation
eatChar();
v = Math.pow(v, parseFactor());
}
if (negate) v = -v; // unary minus is applied after exponentiation; e.g. -3^2=-9
return v;
}
}
return new Parser().parse();
}
不确定您想要的退格字符是什么。
但是您可以使用表示平方根的 unicode 字符或您想要的任何其他 unicode 符号来设置按钮的文本,例如:
Button mySquareRootButton = (Button) findViewById(R.id.my_square_root_button);
mySquareRootButton.setText("\u221A");
你也可以在你的布局中做到这一点 xml:
android:text="\u221A"
你能不能看看我的代码并帮助我在我的项目中添加平方根 (√) 百分比 (%) 和退格 (<-) 按钮。 我认为问题出在 CalcUtils Java 代码上,如果您愿意,我还可以添加 MainActivity.java 和 activity_main.xml 文件。
public final class CalcUtils {
private CalcUtils(){
}
public static boolean isOperator(char c){
return c == '/' ||
c == '÷' ||
c == '*' ||
c == '-' ||
c == '+';
}
public static double evaluate(final String str){
class Parser {
int pos = -1, c;
void eatChar() {
c = (++pos < str.length()) ? str.charAt(pos) : -1;
}
void eatSpace() {
while (Character.isWhitespace(c)) eatChar();
}
double parse() {
eatChar();
double v = parseExpression();
if (c != -1) throw new RuntimeException("Unexpected: " + (char)c);
return v;
}
// Grammar:
// expression = term | expression `+` term | expression `-` term
// term = factor | term `*` factor | term `/` factor | term brackets
// factor = brackets | number | factor `^` factor
// brackets = `(` expression `)`
double parseExpression() {
double v = parseTerm();
for (;;) {
eatSpace();
if (c == '+') { // addition
eatChar();
v += parseTerm();
} else if (c == '-') { // subtraction
eatChar();
v -= parseTerm();
} else {
return v;
}
}
}
double parseTerm() {
double v = parseFactor();
for (;;) {
eatSpace();
if (c == '/' || c == '÷') { // division
eatChar();
v /= parseFactor();
} else if (c == '*' || c == '(') { // multiplication
if (c == '*') eatChar();
v *= parseFactor();
} else {
return v;
}
}
}
double parseFactor() {
double v;
boolean negate = false;
eatSpace();
if (c == '+' || c == '-') { // unary plus & minus
negate = c == '-';
eatChar();
eatSpace();
}
if (c == '(') { // brackets
eatChar();
v = parseExpression();
if (c == ')') eatChar();
} else { // numbers
int startIndex = this.pos;
while ((c >= '0' && c <= '9') || c == '.') eatChar();
if (pos == startIndex) throw new RuntimeException("Unexpected: " + (char)c);
v = Double.parseDouble(str.substring(startIndex, pos));
}
eatSpace();
if (c == '^') { // exponentiation
eatChar();
v = Math.pow(v, parseFactor());
}
if (negate) v = -v; // unary minus is applied after exponentiation; e.g. -3^2=-9
return v;
}
}
return new Parser().parse();
}
不确定您想要的退格字符是什么。
但是您可以使用表示平方根的 unicode 字符或您想要的任何其他 unicode 符号来设置按钮的文本,例如:
Button mySquareRootButton = (Button) findViewById(R.id.my_square_root_button);
mySquareRootButton.setText("\u221A");
你也可以在你的布局中做到这一点 xml:
android:text="\u221A"