[Java] Java字符串转换成算术表达式计算并输出结果 →→→→→进入此内容的聊天室

来自 , 2019-12-07, 写在 Java, 查看 112 次.
URL http://www.code666.cn/view/7fe3d16a
  1. package cn.anycall.test;  
  2.  
  3. import java.math.BigDecimal;  
  4.  
  5. public class TestSHU {  
  6.  
  7.     /**  
  8.      * 两个字符类型的小数进行相加为a+b;  
  9.      *    
  10.      * @param a  
  11.      * @param b  
  12.      * @return  
  13.      */    
  14.     public static String addBigDecimal(String a, String b) {    
  15.         double a1 = Double.parseDouble(a);    
  16.         double b1 = Double.parseDouble(b);    
  17.         BigDecimal a2 = BigDecimal.valueOf(a1);    
  18.         BigDecimal b2 = BigDecimal.valueOf(b1);    
  19.         BigDecimal c2 = a2.add(b2);    
  20.         String c1 = c2 + "";    
  21.         return c1;    
  22.     }    
  23.     /**  
  24.      * 两个字符类型的小数进行相减为a-b;  
  25.      *    
  26.      * @param a  
  27.      * @param b  
  28.      * @return  
  29.      */    
  30.     public static String reduceBigDecimal(String a, String b) {    
  31.         double a1 = Double.parseDouble(a);    
  32.         double b1 = Double.parseDouble(b);    
  33.         BigDecimal a2 = BigDecimal.valueOf(a1);    
  34.         BigDecimal b2 = BigDecimal.valueOf(b1);    
  35.         BigDecimal c2 = a2.subtract(b2);    
  36.         String c1 = c2 + "";    
  37.         return c1;    
  38.     }    
  39.     /**  
  40.      * 两个字符类型的数相乘 a*b=c;  
  41.      *    
  42.      * @param a  
  43.      * @param b  
  44.      * @return  
  45.      */    
  46.     public static String multipliedString(String a, String b) {    
  47.         double a1 = Double.parseDouble(a);    
  48.         double b1 = Double.parseDouble(b);    
  49.         BigDecimal a2 = BigDecimal.valueOf(a1);    
  50.         BigDecimal b2 = BigDecimal.valueOf(b1);    
  51.         BigDecimal c2 = a2.multiply(b2);    
  52.         String c1 = c2 + "";    
  53.         return c1;    
  54.     }    
  55.     /**  
  56.      * 两个字符类型的数相除 a/b=c;  
  57.      *    
  58.      * @param a  
  59.      * @param b  
  60.      * @return  
  61.      */    
  62.     public static String divideString(String a, String b) {    
  63.         double a1 = Double.parseDouble(a);    
  64.         double b1 = Double.parseDouble(b);    
  65.         BigDecimal a2 = BigDecimal.valueOf(a1);    
  66.         BigDecimal b2 = BigDecimal.valueOf(b1);    
  67.         BigDecimal c2 = a2.divide(b2,a2.scale());    
  68.         String c1 = c2 + "";    
  69.         return c1;    
  70.     }    
  71.  
  72.     public static String yunsuanjibie(String s) {  
  73.         String r = "";  
  74.         int p = 0;  
  75.         for (int i = 0; i < s.length(); i++) {  
  76.             if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*'  
  77.                     || s.charAt(i) == '/') {  
  78.                 p++;  
  79.             }  
  80.         }  
  81.         String k[] = new String[2 * p + 1];  
  82.         int k1 = 0;  
  83.         int first = 0;  
  84.         for (int i = 0; i < s.length(); i++) {  
  85.             if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*'  
  86.                     || s.charAt(i) == '/') {  
  87.                 k[k1] = s.substring(first, i);  
  88.                 k1++;  
  89.                 k[k1] = "" + s.charAt(i);  
  90.                 k1++;  
  91.                 first = i + 1;  
  92.             }  
  93.         }  
  94.         k[k1] = s.substring(first, s.length());  
  95.         int kp = p;  
  96.         while (kp > 0) {  
  97.             for (int i = 0; i < k.length; i++) {  
  98.                 if (k[i].equals("*") || k[i].equals("/")) {  
  99.                     int l;  
  100.                     for (l = i - 1; l > -1; l--) {  
  101.                         if (!(k[l].equals("p")))  
  102.                             break;  
  103.                     }  
  104.                     int q;  
  105.                     for (q = i + 1; q < k.length; q++) {  
  106.                         if (!(k[l].equals("p")))  
  107.                             break;  
  108.                     }  
  109.                     if (k[i].equals("*")) {  
  110.                         k[i] = ""+ multipliedString(k[l],k[q]);  
  111.                         k[l] = "p";  
  112.                         k[q] = "p";  
  113.                         kp--;  
  114.                     } else {  
  115.                         k[i] = ""+divideString(k[l],k[q]);  
  116.                         k[l] = "p";  
  117.                         k[q] = "p";  
  118.                         kp--;  
  119.                     }  
  120.                     break;  
  121.                 }  
  122.             }  
  123.             for (int i = 0; i < 2 * p + 1; i++) {  
  124.                 if (k[i].equals("+") || k[i].equals("-")) {  
  125.                     int l;  
  126.                     for (l = i - 1; l > -1; l--) {  
  127.                         if (!(k[l].equals("p")))  
  128.                             break;  
  129.                     }  
  130.                     int q;  
  131.                     for (q = i + 1; q < k.length; q++) {  
  132.                         if (!(k[q].equals("p")))  
  133.                             break;  
  134.                     }  
  135.                     if (k[i].equals("+")) {  
  136.                         k[i] = ""+addBigDecimal(k[l],k[q]);  
  137.                         k[l] = "p";  
  138.                         k[q] = "p";  
  139.                         kp--;  
  140.                     } else {  
  141.                         k[i] = ""+reduceBigDecimal(k[l],k[q]);  
  142.                         k[l] = "p";  
  143.                         k[q] = "p";  
  144.                         kp--;  
  145.                     }  
  146.                     break;  
  147.                 }  
  148.             }  
  149.             for (int i = 0; i < k.length; i++) {  
  150.                 if (!(k[i].equals("p"))) {  
  151.                     r = k[i];  
  152.                     break;  
  153.                 }  
  154.             }  
  155.         }  
  156.         return r;  
  157.     }  
  158.  
  159.     public static void sizeyunsuan(String s) {  
  160.         while (true) {  
  161.             int first = 0;  
  162.             int last = 0;  
  163.             for (int i = 0; i < s.length(); i++) {  
  164.                 if (s.charAt(i) == '(')  
  165.                     first = i;  
  166.                 if (s.charAt(i) == ')') {  
  167.                     last = i;  
  168.                     break;  
  169.                 }  
  170.             }  
  171.             if (last == 0) {  
  172.                 System.out.println(yunsuanjibie(s));  
  173.                 return;  
  174.             } else {  
  175.                 String s1 = s.substring(0, first);  
  176.                 String s2 = s.substring(first + 1, last);  
  177.                 String s3 = s.substring(last + 1, s.length());  
  178.                 s = s1 + yunsuanjibie(s2) + s3;  
  179.             }  
  180.         }  
  181.     }  
  182.  
  183.     public static void main(String[] args) {  
  184.         String s = "1.4+2*32/(3-2.1)";  
  185.         sizeyunsuan(s);  
  186.     }  
  187.  
  188. }  
  189. //java/7134

回复 "Java字符串转换成算术表达式计算并输出结果"

这儿你可以回复上面这条便签

captcha