【问题标题】:How to format a math expression inside a text field?如何在文本字段中格式化数学表达式?
【发布时间】:2016-06-19 12:22:42
【问题描述】:

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



我希望它的格式如下:

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

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

1.000×(5-3)/2

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


到目前为止,我尝试将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 时,结果是:

如我所愿。


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

【问题讨论】:

  • "如我所愿" "那就给自己一个高分吧
  • 我会使用 JTextField 并将 DocumentFilter 添加到该字段(甚至扩展 PlainDocument)。获取文本,检测数字,格式化它们,然后传递给文档
  • @gpasch 这不是我问题的答案,它按照我想要的方式格式化结果,但是当我输入表达式时它不起作用。为什么这么消极?
  • @MarkoKitonjics 您可以使用按键侦听器并在每次按键时格式化数字,这是您需要的还是..?
  • 你有一个复杂的问题,解决起来并不容易。我会从DocumentFilter

标签: java swing calculator number-formatting jformattedtextfield


【解决方案1】:

试试这个。

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

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多