2017-01-13 20 views
0

私はテストアプリケーションで支払いセクションを作ろうとしています。はjavafxのTextFieldに浮動小数点数を表示します

ボタン値(0〜9)をとり、最後に追加するTextFieldがあります。そう

TextField pamount; 

String value = ((Button)event.getSource()).getText(); 

    pamount.setText(pamount.getText()+value); 

私は連続して1から9までのボタンをクリックした場合、私は、TextField

123456789 

を取得する私の問題は、私はそれが

のような浮動数として示すことにしたいということです
1234567.89 

このような値を保持または表示するようにTextFieldをフォーマットする方法はありますか?

ありがとうございます。

+0

'pamount.getText()'と 'value'は' String'です。小数点はありません。だから、ちょうど最後に桁を追加するだけで浮動価値を得る方法を正確に説明する必要があるかもしれません。 – AxelH

答えて

2

あなたはボタンの押下は、いくつかの数の値を変更したい場合は、その番号を保持する変数を定義する必要があります。何らかの点で丸め誤差が累積する浮動小数点演算を繰り返し実行しないようにするには、その変数に整数のセントの数(または通貨の等価数)を保持させるのが最善の方法です。

さらに、テキストフィールド(またはラベル)がその値に対応するテキスト値を常に表示しやすいように、JavaFX observable propertyを使用すると便利です。

private IntegerProperty totalCents = new SimpleIntegerProperty(); 

をしてからお使いのディスプレイは、そのプロパティの書式設定のバージョンにそのテキストをバインドさせることができます:

だから私はどうしたら最後に

display.textProperty().bind(totalCents.divide(100.0).asString("$ %.2f")); 

、あなたのボタンだけで更新する必要があります数値:

private Button createNumberButton(int value) { 
    Button button = new Button(Integer.toString(value)); 

    button.setOnAction(e -> totalCents.set(totalCents.get() * 10 + value)); 

    return button ; 
} 

はここSSCCEです:

import javafx.application.Application; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class PaymentPad extends Application { 

    private IntegerProperty totalCents = new SimpleIntegerProperty(); 

    @Override 
    public void start(Stage primaryStage) { 
     GridPane pad = new GridPane(); 
     pad.setHgap(2); 
     pad.setVgap(2); 

     pad.add(createNumberButton(0), 0, 4); 
     for (int i = 1 ; i <= 9 ; i++) { 
      int columnIndex = (i-1) % 3; 
      int rowIndex = 3 - (i-1) /3 ; 
      pad.add(createNumberButton(i), columnIndex, rowIndex); 
     } 

     Button clearButton = createButton("C"); 
     clearButton.setOnAction(e -> totalCents.set(0)); 
     pad.add(clearButton, 1, 4, 2, 1); 

     Label display = new Label(); 
     display.textProperty().bind(totalCents.divide(100.0).asString("$%.2f")); 
     display.setMaxWidth(Double.MAX_VALUE); 
     display.setAlignment(Pos.CENTER_RIGHT); 
     pad.add(display, 0, 0, 3, 1); 

     Scene scene = new Scene(pad); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private Button createNumberButton(int value) { 
     Button button = createButton(Integer.toString(value)); 
     button.setOnAction(e -> totalCents.set(totalCents.get()*10+value)); 
     return button ; 
    } 

    private Button createButton(String text) { 
     Button button = new Button(text); 
     button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); 
     GridPane.setFillHeight(button, true); 
     GridPane.setFillWidth(button, true); 
     return button ;  
    } 

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

Simply Fantastic!本当に便利です。私は自分のコードをここに追加したいと思っています。私は以下に追加します。件名に興味のある方々に感謝します。文字列値=((Button)event.getSource())。getText(); totalCents.set(totalCents.get()* 10 + Integer.valueOf(value)); pamount.textProperty()。bind(totalCents.divide(100.0).asString( "£%.2f")); – user1971804

1

利用のDecimalFormat:

DecimalFormat format = new DecimalFormat("#.00"); 
String formattedText = format.format(value); 
関連する問題