尝试从文本字段中读取格式化的双精度

Posted

技术标签:

【中文标题】尝试从文本字段中读取格式化的双精度【英文标题】:Trying to read a formatted double from text field 【发布时间】:2015-10-06 14:13:22 【问题描述】:

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

有一个文本字段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,然后点击操作员按钮时,就会发生错误。 所以我假设我只需要使用一个额外的对象来保存结果,或者只是更改我从文本字段中读取的行(这样它也适用于这种更改的格式),但我不知道如何。

【问题讨论】:

不清楚你在问什么。第二次按下操作员按钮时的值是多少? 【参考方案1】:

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

执行

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

【讨论】:

我看到您找到了解决方案。那太棒了。这就是问题所在,德语语言环境使用的格式与您的预期不同。【参考方案2】:

当您使用NumberFormat(或其子类DecimalFormat)的format() 方法时,您恰好使用默认的LocaleLocale,您传递了该方法,具体取决于重载你用。结果,您将获得Locale 格式的输出。

同样的,你应该使用DecimalFormatparse()方法按照同样的规则解析你的显示字段。

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

杰夫

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

例如

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

希望这会有所帮助。

【讨论】:

以上是关于尝试从文本字段中读取格式化的双精度的主要内容,如果未能解决你的问题,请参考以下文章

格式化像货币一样但没有货币符号的双精度值(C#)

使用 fscanf 读取逗号分隔的双精度

将文件中的双值数字读入 C++ 中的向量并访问它们的值

格式,Java 中的双精度和整数的 2 位小数和 0

在 Scala Java Play 框架中格式化没有小数的双精度并为数千添加逗号

从文件中读取字符串和双精度的组合