如何在文本字段中格式化数学表达式?

时间:2016-03-05 19:07:16

标签: java swing calculator number-formatting jformattedtextfield

我正在创建一个计算器软件。在我正在键入的文本字段中,整个表达式显示为一个字符串(我希望保持这种方式)。这是一个演示:

enter image description here

我希望它的格式如下:

  • NUMBERS - ###。###。###,###### (将它们分组为3位数组,仅在需要时显示分数,最多只显示6位数。 )
  • 操作符和括号 - ###×(### - ###)/ ### (不应导致任何格式错误或问题。我不在乎是否存在或数字和运算符/括号之间没有空格。)

以上是正确格式的上述示例:

1.000×(5-3)/ 2

我还希望在我输入时自动更新格式

Sofar我尝试将JFormattedTextFieldMaskFormattersNumberFormat一起使用,但他们都没有像我上面所描述的那样工作。

NumberFormat版本。

public class Frame {
    private NumberFormat numberFormat = NumberFormat.getInstance();
    private JFormattedTextField textField = new JFormattedTextField(numberFormat);
}

MaskFormatter版本。

public class Frame {
    private MaskFormatter maskFormat;
    private JFormattedTextField textField;
    public Frame() {
        try {
            maskFormat = new MaskFormatter("###.###.###,######");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        textField = new JFormattedTextField(maskFormat);
    }
}

我设法使用DecimalFormat格式化结果,但我不想只对结果进行格式化。

格式化结果。

DecimalFormat resultFormat = new DecimalFormat("###,###,###.######");
String result = resultFormat.format(Parser.evaluate(expression));
textField.setText(result);

当我计算5/3时,结果是:

enter image description here

就像我想要的那样。

很抱歉这么详细而且很长的帖子,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

试试这个。

DecimalFormat resultFormat = new DecimalFormat("###,###,###.######");
Pattern numberPattern = Pattern.compile("\\d+(\\.\\d+)?");

String s = "1000×(5-3)/2";
Matcher m = numberPattern.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    double value = Double.parseDouble(m.group());
    String formatted = resultFormat.format(value);
    m.appendReplacement(sb, formatted);
}
m.appendTail(sb);
System.out.println(sb);
// -> 1,000×(5-3)/2