尝试从文本字段中读取格式化的double

时间:2015-10-06 14:13:22

标签: java number-formatting decimalformat

我正在制作一个简单的计算器,目前正试图解决非整数问题。

有一个文本字段displayField,显示结果和操作员按钮以及一个相等的按钮。

让它工作,双重结果只显示小数位,如果有,但我无法将结果返回到计算中。

public class FXMLDocumentController implements Initializable {

private String operator;
double oldValue;
double newValue = 0;
NumberFormat nf = new DecimalFormat("##.###");

@FXML
private TextField displayField;

@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}

@FXML
private void handleDigitAction(ActionEvent event) {
    String digit = ((Button) event.getSource()).getText();
    String oldText = displayField.getText();
    String newText = oldText + digit;
    displayField.setText(newText);
}

@FXML
private void handleOperator(ActionEvent event) {
    oldValue = Double.parseDouble(displayField.getText());
    displayField.setText("");
    operator = ((Button) event.getSource()).getText();
}

@FXML
private void handleEqualAction(ActionEvent event) {

    switch (operator) {
        case "+":
            newValue = oldValue + Double.parseDouble(displayField.getText());
            break;
        case "-":
            newValue = oldValue - Double.parseDouble(displayField.getText());
            break;
        case "*":
            newValue = oldValue * Double.parseDouble(displayField.getText());
            break;
        case "/":
            newValue = oldValue / Double.parseDouble(displayField.getText());
            break;
        default:
            break;
    }

    displayField.setText(String.valueOf(nf.format(newValue)));
}

}

当我尝试首先计算5/2,得到结果2,5然后点击操作员按钮时,会发生错误。 所以我假设我只需要使用一个额外的对象来保存结果,或者只是改变我从文本字段读取的行(这样它也适用于这种改变的格式)但我无法弄清楚如何。

4 个答案:

答案 0 :(得分:1)

您能告诉我们您的应用程序在哪个区域设置上运行吗?

执行

System.out.println(Locale.getDefault()); 

答案 1 :(得分:1)

当您使用format()(或其子类NumberFormat)的DecimalFormat方法时,您恰好使用默认Locale或{{1}您传递方法,具体取决于您使用的重载。因此,您将获得Locale格式化的输出。

同样,您应该使用Locale DecimalFormat方法根据相同的规则解析您的显示字段。

我希望这会有所帮助......

杰夫

答案 2 :(得分:1)

我找到了一个相当“简单”或肮脏的解决方案,似乎有效:

    NumberFormat nf = new DecimalFormat("##.###", new DecimalFormatSymbols(Locale.US));

答案 3 :(得分:1)

您可能正在使用DecimalFormat类来格式化输出。十进制格式化程序使用默认的Locale,在您的情况下为de_DE。 如上面的答案中所述,您可以使用DecimalFormat类的重载方法来获得所需格式的输出。

E.g。

BigDecimal numerator = new BigDecimal(5);
BigDecimal denominator = new BigDecimal(2);

//In current scenario
    Locale locale = new Locale("de", "DE");
    NumberFormat format = DecimalFormat.getInstance(locale);
    String number = format.format(numerator.divide(denominator));
    System.out.println("Parsed value is "+number); 

The output here will be 2,5

如果您更改为:

    Locale localeDefault = new Locale("en", "US");
    NumberFormat formatDefault = DecimalFormat.getInstance(localeDefault);
    String numberVal = formatDefault.format(numerator.divide(denominator));
    System.out.println("Parsed value is "+numberVal); 

   Output here will be 2.5

希望这有帮助。