JAVA如何将数字分组应用于等式

时间:2016-11-03 13:15:39

标签: java

我试图对用户输入的等式进行数字分组,例如尺寸不确定; 9000 + 1000 x 2这是存储在一个字符串中,我想把它变成9,000 + 1,000 x 2.我现在的代码只会工作,直到它达到非数字是我的方式我可以记录位置它找到非数字的位置并跳过它以获得下一个数字。

到目前为止我的代码;

DecimalFormat formatter = new DecimalFormat("#,###.##");

    if(loop == true) {
        double amount = ((Number)NumberFormat.getInstance().parse(CalculatorComponent.values)).intValue();  
        temp = formatter.format(amount);
        System.out.println(temp);
    }

循环变量目前始终设置为true,而CalculatorComponent.values是当前输入数据的字符串,包括运算符。

1 个答案:

答案 0 :(得分:2)

这是一个使用正则表达式解析输入并替换值的解决方案。

// your format
DecimalFormat formatter = new DecimalFormat("#,###.##");
// your input
String input = "9000 + 1000 x 2";
// StringBuffer holding the replaced String
StringBuffer result = new StringBuffer(input.length());
// pattern for 1+ consecutive digits
Pattern pattern = Pattern.compile("\\d+");
// matcher for your input
Matcher matcher = pattern.matcher(input);
// iterating over matches
while (matcher.find()) {
    // replacing matches
    matcher.appendReplacement(
        result, 
        formatter.format(Integer.valueOf(matcher.group()))
    );
}
// appending tail (not applicable in this example, but need to have)
matcher.appendTail(result);
// printing result
System.out.println(result);

<强>输出

9,000 + 1,000 x 2

备注

  • Matcher#appendReplacement需要一个StringBuffer,而不是一个StringBuilder - 从来没有弄明白为什么,因为它没有利用任何多线程操作
  • 您需要将数字匹配转换为Number以格式化它们(因此Integer.valueOf调用),但该操作在此上下文中是安全的
  • 如果您在最后一个令牌之后有任何不匹配的文本,Matcher#appendTail调用很有用,因此它也可以添加到结果中
  • 这适用于普通数字整数。但是,如果您已经在等式或十进制数字中使用了本地化数字表达式,那么您可能需要一个微调模式