2015-01-16 84 views
0

我正在尋找一種解決方案將我從組合框中獲得的字符串轉換爲雙倍。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!"); 
    } 

但是......它不工作。

+0

爲什麼不只是使用'ComboBox '? –

+0

這將是一個通用的解決方案,但不適合我,因爲可用性方面我必須使用基於本地化的逗號分隔的數字。 而ComboBox 只接受ObserverList ,因此數字必須是「0.187」,而不是「0,187」。 –

+0

因此,使用格式對象將值和單元格工廠轉換爲您想要的值。 –

回答

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); 
    } 
+0

它的工作效果很好。請考慮upvote並接受我以前的答案。 – MWiesner

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" 
); 
+0

該死的。好的。是的,但在歐盟,你使用逗號而不是雙精度和浮點數。你知道其他方法來轉換逗號分隔數字嗎? –

+1

對於大多數歐洲國家和數據點的可視化表示,情況都是如此。然而,當進行數學或計算時,你必須使用「點」符號。另見這裏:http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html – MWiesner

2

如果要顯示逗號(,),您可以考慮轉換爲。解析之前。

double dSize = Double.parseDouble(bottleSize.getValue().replace(",",".")); 
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); 
    } 
}