62,621
社区成员
发帖
与我相关
我的任务
分享temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right)); private int find_ChengAndChu(String s) {
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (c == '*')
return 100+i+1;
else
{
if (c == '/')
return 200+1+i;
}
}
return 0;
}
private int find_JiaAndJian(String s)
{
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (c == '+')
return 300+i+1;
else
{
if ((c == '-') && i != 0 && (s.charAt(i - 1) >= '0'&&s.charAt(i - 1) <= '9'))
return 400+i+1;
}
}
return 0;
}
private String find_Left(String s)
{
int n = 0;
for (int i = s.length()-1; i >= 0; i--)
{
char c = s.charAt(i);
if ((c >= '0'&&c <= '9')||c =='.' || i == 0)
n++;
else
break;
}
return s.substring(s.length()-n);
}
private String find_Right(String s)
{
int n = 0;
for (int i =0; i<s.length(); i++)
{
char c = s.charAt(i);
if ((c >= '0'&&c <= '9') || c == '.'|| i ==0)
n++;
else
break;
}
return s.substring(0,n);
}
private String chuLing(String s)
{
if (Double.parseDouble(s) - Integer.parseInt(s) == 0)
s = String.valueOf(Integer.parseInt(s));
else
{
int n = 0;
for (int i = s.length() - 1; i >= 0; i--)
{
char c = s.charAt(i);
if (c == '0')
n++;
else
break;
}
s = s.substring(0,s.length() - n).toString();
}
return s;
}
private String jiSuan(String s) {
//if 处理括号问题
if (s.indexOf(')') + 1 != 0)
{
//核心就是找出配对括号,将 字符串中“ (算式)”替换乘算式的结果
//循环调用,最终变成一个无括号的字符串算式
//最后再计算这个无括号的字符串算式,就能返回一个字符串类型的结果
for (int right = s.indexOf(')') + 1 ; right > 0; )
{
int left = s.substring(0,right - 1).toString().lastIndexOf('(') + 1;
String sLeft = s.substring(0,left - 1).toString();
String sRight = s.substring(right);
s = sLeft + jiSuan(s.substring(0,right - 1).toString().substring(left)) + sRight;
}
return jiSuan(s);
}
// else 做四则运算
else
{
//思路:先找到运算符,再找这个运算符的两个操作数
// 计算,返回 “将原字符串中 此次运算的算式 替换为 运算结果” 的字符串
//乘除运算
for (int i = find_ChengAndChu(s);i>0 ;)
{
int mark = i / 100;
int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where).toString());
String temp = "";
if (mark == 1)
{
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
temp = chuLing(temp);
}
if (mark == 2)
{
if(Double.parseDouble(right) == 0) {
throw new ArithmeticException();
}
else {
temp = String.valueOf(Double.parseDouble(left)/Double.parseDouble(right));
temp = chuLing(temp);
}
}
s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
i = find_ChengAndChu(s);
}
//加减运算
for (int i = find_JiaAndJian(s); i>0;)
{
int mark = i / 100;
int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where));
String temp = "";
if (mark == 3)
{
temp = String.valueOf(Double.parseDouble(left) + Double.parseDouble(right));
temp = chuLing(temp);
}
if (mark == 4)
{
temp = String.valueOf(Double.parseDouble(left) - Double.parseDouble(right));
temp = chuLing(temp);
}
s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
i = find_JiaAndJian(s);
}
return s;
}
}int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where).toString());
String temp = "";
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
int mark = i / 100;
int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where).toString());
String temp = "";
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
temp = chuLing(temp);