Javafx:如何将组合框字符串转换为双精度

Javafx: How to convert combobox strings to double

我正在寻找一种解决方案,将从组合框获得的字符串转换为双精度字符串。

我是 JavaFX 的新手,正在尝试将旧的 swing 项目转换为 fx。

在 Swing 中我有这样的东西:

NumberFormat nf = NumberFormat.getInstance();
    nf.setMaximumFractionDigits(2);
    nf.setMinimumFractionDigits(2);

    String stringPrice = jTextFieldPrice.getText();

    try {
        double size= nf.parse(jComboboxSize.getItemAt(jComboboxSize.getSelectedIndex()).toString()).doubleValue();          
        double price= nf.parse(stringPrice).doubleValue();
        double newPrice= price * size;
...

到目前为止我的外汇代码

@FXML
private ComboBox<String> bottleSize;
@FXML
private TextField txfBottlePrice;

ObservableList<String> bottleList = FXCollections.observableArrayList(
    "0,187", 
    "0,25", 
    "0,375", 
    "0,5", 
    "0,62", 
    "0,7", 
    "0,75", 
    "0,8", 
    "1", 
    "1,5" 
);

....
....
   String sPrice = txfBottlePrice.getText();

    try {
         double dSize = Double.parseDouble(bottleSize.getValue());
         double dPrice = Double.parseDouble(sPrice);
         double newPrice = dPrice * dSize;

         txfPriceLiter.setText(Double.toString(newPrice));

    }catch ( NumberFormatException e) {
        System.out.println("Something went wrong!");
    }

但是...它不起作用。

请注意,您的代码使用的输入数据不是双重兼容格式。他们必须在数字部分之间使用点 . 而不是 .,.. 格式。试试这个:

ObservableList<String> bottleList = FXCollections.observableArrayList(
    "0.187", 
    "0.25", 
    "0.375", 
    "0.5", 
    "0.62", 
    "0.7", 
    "0.75", 
    "0.8", 
    "1", 
    "1.5" 
);

谢谢! 我很困惑,因为起初我尝试了我的旧 NumberFormat 代码,但是 NumberFormat 是未知的,Netbeans 不想导入它。所以我认为它在 JavaFX 中不可用。 但是在我粘贴代码之后,它以某种方式识别了它并导入了包。

现在可以使用了。

 NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
    nf.setMaximumFractionDigits(2);
    nf.setMinimumFractionDigits(2);


    try {
        double dSize = nf.parse(bottleSize.getValue()).doubleValue();
        double dPrice = nf.parse(txfBottlePrice.getText()).doubleValue();
        double newPrice = dPrice * dSize;
        txfPriceLiter.setText(nf.format(newPrice));
    } catch (java.text.ParseException ex) {
       Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
    }

如果您想显示逗号 (,),您可以考虑将 , 转换为 .解析之前。

double dSize = Double.parseDouble(bottleSize.getValue().replace(",","."));

如果你的 ComboBox 代表数字,它应该是 ComboBox<Double>。使用 NumberFormat 将字符串转换为要存储在组合框中的值,并将其包装在组合框的 StringConverter 中。

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import javafx.util.converter.FormatStringConverter;

public class ComboBoxDoubleDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        List<String> inputData = Arrays.asList(
                "0,187", 
                "0,25", 
                "0,375", 
                "0,5", 
                "0,62", 
                "0,7", 
                "0,75", 
                "0,8", 
                "1", 
                "1,5" 
            );
        ComboBox<Double> bottleSize = new ComboBox<>();
        NumberFormat format = DecimalFormat.getInstance(Locale.GERMANY);

        StringConverter<Double> converter = new FormatStringConverter<>(format);

        bottleSize.getItems().addAll(
                inputData.stream().map(converter::fromString).collect(Collectors.toList()));

        // or, depending on your requirements, just do

//      bottleSize.getItems().addAll(
//            0.187d, 0.25d, 0.375d, 0.5d, 0.62d, 0.7d, 0.75d, 0.8d, 1d, 1.5d
//        );


        bottleSize.setConverter(new FormatStringConverter<Double>(format));
        bottleSize.getSelectionModel().selectFirst();

        TextField txfBottlePrice = new TextField();
        txfBottlePrice.setEditable(false);
        txfBottlePrice.textProperty().bind(bottleSize.valueProperty().asString(Locale.GERMANY, "%.3f"));

        VBox root = new VBox(10, bottleSize, txfBottlePrice);
        primaryStage.setScene(new Scene(root, 350, 150));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}