package ml.puredark.hviewer.utils; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MathUtil { /** * 格式化日期 * * @param obj 日期对象 * @param format 格式化字符串 * @return */ public static String formatDate(Object obj, String format) { if (obj == null) return ""; String s = String.valueOf(obj); if (format == null || "".equals(format.trim())) { format = "yyyy-MM-dd"; } try { SimpleDateFormat dateFormat = new SimpleDateFormat(format); s = dateFormat.format(obj); } catch (Exception e) { } return s; } /** * 格式化数字 * * @param obj 数字对象 * @param format 格式化字符串 * @return */ public static String formatNumber(Object obj, String format) { if (obj == null) return ""; String s = String.valueOf(obj); if (format == null || "".equals(format.trim())) { format = "#.00"; } try { if (obj instanceof Double || obj instanceof Float) { if (format.contains("%")) { NumberFormat numberFormat = NumberFormat.getPercentInstance(); s = numberFormat.format(obj); } else { DecimalFormat decimalFormat = new DecimalFormat(format); s = decimalFormat.format(obj); } } else { NumberFormat numberFormat = NumberFormat.getInstance(); s = numberFormat.format(obj); } } catch (Exception e) { } return s; } /** * 计算字符串四则运算表达式 * * @param string * @return */ public static String computeString(String string) { String regexCheck = "[\\(\\)\\d\\+\\-\\*/\\.]*";// 是否是合法的表达式 if (!Pattern.matches(regexCheck, string)) return string; Matcher matcher = null; String temp = ""; int index = -1; String regex = "\\([\\d\\.\\+\\-\\*/]+\\)";// 提取括号表达式 string = string.replaceAll("\\s", "");// 去除空格 try { Pattern pattern = Pattern.compile(regex); // 循环计算所有括号里的表达式 while (pattern.matcher(string).find()) { matcher = pattern.matcher(string); while (matcher.find()) { temp = matcher.group(); index = string.indexOf(temp); string = string.substring(0, index) + computeStirngNoBracket(temp) + string.substring(index + temp.length()); } } // 最后计算总的表达式结果 string = computeStirngNoBracket(string); } catch (NumberFormatException e) { return e.getMessage(); } return string; } /** * 计算不包含括号的表达式 * * @param string * @return */ private static String computeStirngNoBracket(String string) { string = string.replaceAll("(^\\()|(\\)$)", ""); String regexMultiAndDivision = "[\\d\\.]+(\\*|\\/)[\\d\\.]+"; String regexAdditionAndSubtraction = "(^\\-)?[\\d\\.]+(\\+|\\-)[\\d\\.]+"; String temp = ""; int index = -1; // 解析乘除法 Pattern pattern = Pattern.compile(regexMultiAndDivision); Matcher matcher = null; while (pattern.matcher(string).find()) { matcher = pattern.matcher(string); if (matcher.find()) { temp = matcher.group(); index = string.indexOf(temp); string = string.substring(0, index) + doMultiAndDivision(temp) + string.substring(index + temp.length()); } } // 解析加减法 pattern = Pattern.compile(regexAdditionAndSubtraction); while (pattern.matcher(string).find()) { matcher = pattern.matcher(string); if (matcher.find()) { temp = matcher.group(); index = string.indexOf(temp); if (temp.startsWith("-")) { string = string.substring(0, index) + doNegativeOperation(temp) + string.substring(index + temp.length()); } else { string = string.substring(0, index) + doAdditionAndSubtraction(temp) + string.substring(index + temp.length()); } } } return string; } /** * 执行乘除法 * * @param string * @return */ private static String doMultiAndDivision(String string) { String value = ""; double d1 = 0; double d2 = 0; String[] temp = null; if (string.contains("*")) { temp = string.split("\\*"); } else { temp = string.split("/"); } if (temp.length < 2) return string; d1 = Double.valueOf(temp[0]); d2 = Double.valueOf(temp[1]); if (string.contains("*")) { value = String.valueOf(d1 * d2); } else { value = String.valueOf(d1 / d2); } return value; } /** * 执行加减法 * * @param string * @return */ private static String doAdditionAndSubtraction(String string) { double d1 = 0; double d2 = 0; String[] temp = null; String value = ""; if (string.contains("+")) { temp = string.split("\\+"); } else { temp = string.split("\\-"); } if (temp.length < 2) return string; d1 = Double.valueOf(temp[0]); d2 = Double.valueOf(temp[1]); if (string.contains("+")) { value = String.valueOf(d1 + d2); } else { value = String.valueOf(d1 - d2); } return value; } /** * 执行负数运算 * * @param string * @return */ private static String doNegativeOperation(String string) { String temp = string.substring(1); if (temp.contains("+")) { temp = temp.replace("+", "-"); } else { temp = temp.replace("-", "+"); } temp = doAdditionAndSubtraction(temp); if (temp.startsWith("-")) { temp = temp.substring(1); } else { temp = "-" + temp; } return temp; } }