package a.runstringregex;
import java.math.BigDecimal;
/**
* DESC:采用BigDecimal进行运算的简单封装<BR>
* @author Goma(OMA1989@YEAH.NET)
*
*/
public class ProgramService
{
/**
* param:String
* 将Null转为Zero
* @return "0"
*/
private String null2zero(String str)
{
if (str == null || "".equals(str))
{
str = "0";
}
return str;
}
/**
* 提供精确的加法运算
* @param v1 被加
* @param v2 加数
* @return 两个参数的和
*/
public String add(String v1, String v2)
{
v1 = null2zero(v1);
v2 = null2zero(v2);
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).toString();
}
/**
* 提供精确的加法运算
* @param params
* @return 两个参数的和
*/
public String add2(String[] params)
{
String v0 = null2zero(params[0]);
BigDecimal b0 = new BigDecimal(v0);
for (int i = 1; i < params.length; i++)
{
String v1 = null2zero(params[i]);
b0 = b0.add(newbigdecimal转换为integer BigDecimal(v1));
}
return b0.toString();
}
/**
* 提供精确的减法运算
* @param v1 被减
* @param v2 减数
* @return 两个参数的差
*/
public String sub(String v1, String v2)
{
v1 = null2zero(v1);
v2 = null2zero(v2);
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).toString();
}
/**
* 提供精确的减法运算
* @param params
* @return 传入参数 下标为0,与其他参数的差
*/
public String sub2(String[] params)
{
String v0 = null2zero(params[0]);
BigDecimal b = new BigDecimal(v0);
for (int i = 1; i < params.length; i++)
{
String v1 = null2zero(params[i]);
b = b.subtract(new BigDecimal(v1));
}
return b.toString();
}
/**
* 提供精确的乘法运算
* @param v1 被乘
* @param v2 乘数
* @return 两个参数的积
*/
public String mul(String v1, String v2)
{
v1 = null2zero(v1);
v2 = null2zero(v2);
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
}
/**
* DESC:提供精确的乘法运算
* @param params
* @return 传入参数的积
*/
public String mul2(String[] params)
{
String v0 = null2zero(params[0]);
BigDecimal b1 = new BigDecimal(v0);
for (int i = 1; i < params.length; i++)
{
String v1 = null2zero(params[i]);
b1 = b1.multiply(new BigDecimal(v1));
}
return b1.toString();
}
/**
* 提供(相对)精确的除法运算 当发生除不尽的情况时,由scale参数
* 定精度,以后的数字四舍五入
* @param v1 被除
* @param v2 除数
* @param scale 表示表示 精确到小数点以后几位
* @return 两个参数的商
*/
public String div(String v1, String v2, int scale)
{
if (scale < 0)
{
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
v1 = null2zero(v1);
v2 = null2zero(v2);
if ("0".equals(v2)||"0.00".equals(v2))
{
return "0";
}
else
{
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
}
}
}
package a.runstringregex;
/**
* DESC:字符串表达式计算
* @author Goma(OMA1989@YEAH.NET)
* DEMO:
* RunStringReg.cacComplex("1+1*2+(10-(2*(5-3)*(2-1))-4)+10/(5-0)");
* 思路整理:
* 1.判断表达式中是否存在括号,如果存在,则提取括号中的表达式,进行计算(见步骤2),计算结束后,再次执行步骤1;如果不存在则直接执行步骤2.
* 2.判断是否有乘除运算,如果有,则先执行乘除运算,执行完毕后再次执行步骤2;如果不存在则直接执行加减运算返回结果。
* 解决方案来源 sghitxia
*/
public class RunStringReg {
private static ProgramService ps = new ProgramService();
/**
* DESC:判断表达式是否有括号,有括号,则先计算括号内的表达式,无则直接运算结果。
* @param str
* @return 运算结果
*/
public static String cacComplex(String str) {
if (str.equals(""))
return "0";
int has = str.indexOf("[");
int have = str.indexOf("{");
System.out.println("RUN BEFORE:"+str);
if(has!=-1||have!=-1){
str = placeAll("[\\[\\{]", "(").replaceAll("[\\]\\}]", ")");//将字符串中的"{}"、"[]"替换成"()"
System.out.println("TURN '{,[':" + str);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论