我正在寻找一种解决方案,将我从组合框中获得的字符串转换为双倍。
我是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!");
}
但......它没有用。
答案 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);
}