我想构建计算器,所以我要求我获得String变量以转换为double
String input =“3 + 5 * -2 + 4”; 双输入2; //输入3 + 5 * -2 + 4;
我想从String转换double,谢谢。
答案 0 :(得分:1)
OP希望将一串数学转换为结果。所以他想输入例如" 3 + 5"结果是8。
您可以使用javascript引擎构建:
public static void main(String[] args) throws Exception {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String expression = "3+5*-2+4";
System.out.println(engine.eval(expression)); //prints -3
}
答案 1 :(得分:0)
试试此代码。
TextView textView=(TextView)findViewById(R.id.textview1);
String input = "3+5*-2+4";
input=input+")";
Calc calc=new Calc();
calc.InfPos(string);
Data result=calc.PostEval();
if(result.flag==0){
textView.setText("="+result.num);
}
这是Calc类
public class Calc{
public Data[] pos= new Data[50];
public Data[] data=new Data[50];//used in stack
int top=-1,MAXSIZE=50;
Data op=new Data();//stores result and errors
public Stack <Character> stack =new Stack <Character>();
public Stack <Double> stackInt =new Stack <Double>();
public int j;
void push(Data p)
{
if (top== MAXSIZE-1)
{
/*over flow error*/
}
else
{
top++;
data[top]=new Data();
data[top]=p;
}
}
Data pop()
{
Data item = null;
if (top == -1){
//stack is empty
}
else
{
item=data[top];
top--;
}
return item;
}
int prec(char ch)
{
switch(ch)
{
case '(':
return 1;
case ')':
return 2;
case '-':
case '+':
return 3;
case '/':
case '*':
return 4;
case '^':
return 5;
case '.':return 6;
default:
return 0;
}
}
void InfPos(String eqn){
double num=0;
double point=0;
double pow=1;
int count=0;
boolean char_flag=false;
boolean minus=false;
boolean decimal=false;
stack.push('(');
j=-1;
j++;
pos[j]=new Data();
pos[j].ch='(';
pos[j].flag=3;
for(int i = 0;i<eqn.length();i++){
if(eqn.charAt(i)>=48 && eqn.charAt(i)<=57){
if(decimal==true)
count++;
switch(eqn.charAt(i)){
case '0':num=(num*10)+0;
break;
case '1':num=(num*10)+1;
break;
case '2':num=(num*10)+2;
break;
case '3':num=(num*10)+3;
break;
case '4':num=(num*10)+4;
break;
case '5':num=(num*10)+5;
break;
case '6':num=(num*10)+6;
break;
case '7':num=(num*10)+7;
break;
case '8':num=(num*10)+8;
break;
case '9':num=(num*10)+9;
break;
}
if(eqn.charAt(i+1)<48)
{
if(decimal==true){
for(int k=0;k<count;k++){
pow=pow*10;
}
point=num/pow;
if((j>=0 && pos[j].flag==1) && pos[j].num_set!=true){
if(pos[j].num<0)
{
point=point*-1;
minus=false;
}
num=pos[j].num+point;
}
else{
num=0+point;
j++;
pos[j]=new Data();
}
if(minus==true)
{
num=num*-1;
minus=false;
}
pos[j].num=num;
pos[j].flag=1;
pos[j].num_set=true;
num=0;
count=0;
pow=1;
decimal=false;
minus=false;
char_flag=false;
}
else{
j++;
pos[j]=new Data();
if(minus==true)
{
num=num*-1;
minus=false;
}
pos[j].num=num;
pos[j].flag=1;
num=0;
minus=false;
char_flag=false;
}
}
char_flag=false;
}
else if(eqn.charAt(i)<48){
char ch;
char tmp=eqn.charAt(i);
if(char_flag==true && tmp=='-'){
minus=true;
if(eqn.charAt(i+1)=='(')
i++;
}
else if(j==0 && tmp=='-')
{
minus=true;
if(eqn.charAt(i+1)=='(')
i++;
}
else if(tmp=='-' && eqn.charAt(i-1)=='(')
{
minus=true;
if(eqn.charAt(i+1)=='(')
i++;
}
else if(tmp!='(' && tmp!=')')
char_flag=true;
if(minus!=true ){
switch(prec(tmp))
{
case 1:if(i>0 && (eqn.charAt(i-1)==')' || prec(eqn.charAt(i-1))==0)){
tmp='*';
ch=stack.pop();
while(prec(ch)>=prec(tmp))
{
j++;
pos[j]=new Data();
pos[j].ch=ch;
pos[j].flag=2;
ch=stack.pop();
}
stack.push(ch);
stack.push(tmp);
tmp='(';
}
stack.push('(');
j++;
pos[j]=new Data();
pos[j].ch='(';
pos[j].flag=3;
break;
case 2:
ch=stack.pop();
while(ch!='(')
{
j++;
pos[j]=new Data();
pos[j].ch=ch;
pos[j].flag=2;
ch=stack.pop();
}
j++;
pos[j]=new Data();
pos[j].ch=')';
pos[j].flag=5;
if(i+1<eqn.length() && prec(eqn.charAt(i+1))==0){
tmp='*';
ch=stack.pop();
while(prec(ch)>=prec(tmp))
{
j++;
pos[j]=new Data();
pos[j].ch=ch;
pos[j].flag=2;
ch=stack.pop();
}
stack.push(ch);
stack.push(tmp);
}
break;
case 3:
case 4:
case 5:
ch=stack.pop();
while(prec(ch)>=prec(tmp))
{
j++;
pos[j]=new Data();
pos[j].ch=ch;
pos[j].flag=2;
ch=stack.pop();
}
stack.push(ch);
stack.push(tmp);
break;
case 6:decimal=true;
count=0;
break;
}
if(prec(tmp)!=6)
pos[j].num_set=true;
}
else if(minus==true && eqn.charAt(i)=='('){
stack.push('(');
j++;
pos[j]=new Data();
pos[j].ch='(';
pos[j].flag=4;//negate inside value
minus=false;
char_flag=false;
}
if(prec(tmp)==6)
decimal=true;
}
}
}
Data PostEval(){
top=-1;
Data x = null,y=null;
for(int k = 0;k<=j;k++){
switch(pos[k].flag){
case 1:push(pos[k]);
break;
case 2:
if(top>=2){
y=pop();
x=pop();
if(x.flag!=1 || y.flag!=1){
op.flag=1;
return op;
}
if(y.num==0 && pos[k].ch=='/')
{
op.flag=2;
return op;
}
switch(pos[k].ch)
{
case '+':
x.num=x.num+y.num;
x.flag=1;
push(x);
break;
case '-':
x.num=x.num-y.num;
x.flag=1;
push(x);
break;
case '*':
x.num=x.num*y.num;
x.flag=1;
push(x);
break;
case '/':
x.num=x.num/y.num;
x.flag=1;
push(x);
break;
}
}
else{
op.flag=1;//syntax error
return op;
}
break;
case 3:
/*open brace,no need of negation*/
push(pos[k]);
break;
case 4:
/*open brace,negate the value inside*/
push(pos[k]);
break;
case 5:
/*close brace.
* negate inside data if needed*/
y=pop();
x=pop();
if(x==null){
op.flag=1;//syntax error
return op;
}
if(x.flag==4){
y.num=y.num*-1;
push(y);
}
else if(y.ch=='('){
/*empty braces.*/
push(x);
}
else
push(y);
break;
}
}
if(top>0){
op.flag=1;//syntax error
return op;
}
op=pop();
op.flag=0;//success execution
return op;
}
}
这是数据模型
public class Data {
public double num;
public char ch;
public int flag;
public boolean num_set;//defines if num contains a decimal value or not
Data(){
num=0;
ch='#';
flag=0;
num_set=false;
}
}
它还可以评估包括parathesis在内的表达式。 例如:强>
String input = "3+(5*-2)+4+(5*4)";
还支持浮动投票操作,例如
String input = "3+2.25+(5*4)";