2017-01-13 2 views
0

Я пытаюсь сделать раздел оплаты в своем тестовом приложении., показывающий плавающие числа в TextField в javafx

У меня есть TextField, который принимает значение кнопок (от 0 до 9) и добавляет его в конец.

TextField pamount; 

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

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

так, если я нажимаю кнопки от 1 до 9 последовательно, я получаю

123456789 

в TextField

Моя проблема заключается в том, что я хочу, чтобы это было показано, как число с плавающей как

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

Просто фантастично! Действительно полезно. Я хочу добавить здесь свой код, на который ссылается ваш. Я добавлю ниже. Большое спасибо всем, кто интересуется предметом. String value = ((Button) event.getSource()). GetText(); totalCents.set (totalCents.get() * 10 + Integer.valueOf (значение)); pamount.textProperty(). Bind (totalCents.divide (100.0) .asString ("£% .2f")); – user1971804

1

Использование DecimalFormat:

DecimalFormat format = new DecimalFormat("#.00"); 
String formattedText = format.format(value);