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);
}
}
我正在寻找一种解决方案,将从组合框获得的字符串转换为双精度字符串。
我是 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);
}
}