Javafx:如何将组合框字符串转换为double

时间:2015-01-16 14:39:59

标签: java javafx

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

我是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;
...

到目前为止我的FX代码

@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!");
    }

但......它没有用。

4 个答案:

答案 0 :(得分:2)

如果要显示逗号(,),可以考虑转换为。在解析之前。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

如果您的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);
    }
}

答案 3 :(得分:0)

谢谢! 我很困惑,因为起初我尝试了旧的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);
    }