一个简单的表达式求值类,java

类别:Java 点击:0 评论:0 推荐:

import java.util.Date;
public class testcalc2
{
 String a;
 int len_of_str;
 int err;           //err 用于发现哪个字符是出错字符就是第一个出错字符串的下标,初始值为-1,表示无错
 int index;

 public testcalc2(String str)
 {
  a = str + "+";
  len_of_str = a.length();
  err = -1;
  index = 0;
  System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%% " + a + len_of_str);

 }

 public double getnextnum()
 {
  int preindex = index, countofdot = 0;
  if(a.charAt(index) == '-')
   index++;
  if(!Character.isDigit(a.charAt(index)))
  {
   err = index;
   return 0;
  }
  while((index < len_of_str) &&
   (Character.isDigit(a.charAt(index)) || a.charAt(index) == '.'))
  {
   if(a.charAt(index) == '.')
   {
    countofdot++;
   }
   index++;
   if(countofdot == 2)
   {
    err = index;

    return 0;
   }
  }
  return Double.valueOf(a.substring(preindex, index)).doubleValue();
 }
 public char getnextop()
 {
  char ch = a.charAt(index);
  if((ch != '+') && (ch != '-') && (ch != '*') && (ch != '/'))
  {
   err = index;
   ch = ' ';
   return ch;
  }
  index++;
  return ch;

 }
 public double calcuvalue()
 {
  long start = System.currentTimeMillis();
  Date d = new Date();
  long now = d.getTime(), dif;
  char ch;
  boolean minusflag = false, multiflag = false, dividflag = false;
  double total = 0, next = 0, num = 0;    //next used to be * or /
  while(index < len_of_str)
  {
   num = getnextnum();
   if(err != -1)
   {
    System.out.println("err!?! try to getnextnum but " +
         " the char at index " + err + " is wrong ");
    return 0;
   }
   System.out.println("index after " + index);

   ch = getnextop();
   if(err != -1)
   {
    System.out.println("err!?! try to getnextop but " +
         " the char at index " + err + " is wrong ");
    return 0;
   }
   System.out.println("index after " + index);

   switch (ch)
   {
    case '+':

     if(multiflag)
     {
      next = next * num;
     }
     else if(dividflag)
     {
      next = next / num;
     }
     else
     {
      next = num;
     }
     if(minusflag)
     {
      next = -next;
     }
     total = total + next;
     minusflag = false;
     multiflag = false;
     dividflag = false;
     break;
    case '-':
     if(multiflag)
     {
      next = next * num;
     }
     else if(dividflag)
     {
      next = next / num;
     }
     else
     {
      next = num;
     }
     if(minusflag)
     {
      next = -next;
     }
     total = total + next;
     minusflag = true;
     multiflag = false;
     dividflag = false;
     break;
    case '*':
     if(multiflag)
     {
      next = next * num;
     }
     else if(dividflag)
     {
      next = next / num;
     }
     else
     {
      next = num;
     }
     multiflag = true;
     dividflag = false;
     break;

    case '/':
     if(multiflag)
     {
      next = next * num;
     }
     else if(dividflag)
     {
      next = next / num;
     }
     else
     {
      next = num;
     }
     dividflag = true;
     multiflag = false;
     break;
    default:         //impossible ,already has err
   }
   System.out.println("ch " + ch + " num " + num + " total " + total +
        " next " + next + " -" + minusflag + " *" +
        multiflag + " /" + dividflag);
  }                       //while

  return total;

 }

本文地址:http://com.8s8s.com/it/it15471.htm