package net.thirdy.blackmarket.samples; import java.util.*; import java.text.NumberFormat; import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class NumberFormatDemo extends Application { // Combo box for selecting available locales private ComboBox<String> cboLocale = new ComboBox<>(); // Text fields for interest rate, year, and loan amount private TextField tfInterestRate = new TextField("6.75"); private TextField tfNumberOfYears = new TextField("15"); private TextField tfLoanAmount = new TextField("107000"); private TextField tfFormattedInterestRate = new TextField(); private TextField tfFormattedNumberOfYears = new TextField(); private TextField tfFormattedLoanAmount = new TextField(); // Text fields for monthly payment and total payment private TextField tfTotalPayment = new TextField(); private TextField tfMonthlyPayment = new TextField(); // Compute button private Button btCompute = new Button("Compute"); // Current locale private Locale locale = Locale.getDefault(); // Declare locales to store available locales private Locale locales[] = Calendar.getAvailableLocales(); /** Initialize the combo box */ public void initializeComboBox() { // Add locale names to the combo box for (int i = 0; i < locales.length; i++) cboLocale.getItems().add(locales[i].getDisplayName()); } @Override // Override the start method in the Application class public void start(Stage primaryStage) { initializeComboBox(); // Pane to hold the combo box for selecting locales HBox hBox = new HBox(5); hBox.getChildren().addAll( new Label("Choose a Locale"), cboLocale); // Pane to hold the input GridPane gridPane = new GridPane(); gridPane.add(new Label("Interest Rate"), 0, 0); gridPane.add(tfInterestRate, 1, 0); gridPane.add(tfFormattedInterestRate, 2, 0); gridPane.add(new Label("Number of Years"), 0, 1); gridPane.add(tfNumberOfYears, 1, 1); gridPane.add(tfFormattedNumberOfYears, 2, 1); gridPane.add(new Label("Loan Amount"), 0, 2); gridPane.add(tfLoanAmount, 1, 2); gridPane.add(tfFormattedLoanAmount, 2, 2); // Pane to hold the output GridPane gridPaneOutput = new GridPane(); gridPaneOutput.add(new Label("Monthly Payment"), 0, 0); gridPaneOutput.add(tfMonthlyPayment, 1, 0); gridPaneOutput.add(new Label("Total Payment"), 0, 1); gridPaneOutput.add(tfTotalPayment, 1, 1); // Set text field alignment tfFormattedInterestRate.setAlignment(Pos.BASELINE_RIGHT); tfFormattedNumberOfYears.setAlignment(Pos.BASELINE_RIGHT); tfFormattedLoanAmount.setAlignment(Pos.BASELINE_RIGHT); tfTotalPayment.setAlignment(Pos.BASELINE_RIGHT); tfMonthlyPayment.setAlignment(Pos.BASELINE_RIGHT); // Set editable false tfFormattedInterestRate.setEditable(false); tfFormattedNumberOfYears.setEditable(false); tfFormattedLoanAmount.setEditable(false); tfTotalPayment.setEditable(false); tfMonthlyPayment.setEditable(false); VBox vBox = new VBox(5); vBox.getChildren().addAll(hBox, new Label("Enter Annual Interest Rate, " + "Number of Years, and Loan Amount"), gridPane, new Label("Payment"), gridPaneOutput, btCompute); // Create a scene and place it in the stage Scene scene = new Scene(vBox, 400, 300); primaryStage.setTitle("NumberFormatDemo"); // Set the stage title primaryStage.setScene(scene); // Place the scene in the stage primaryStage.show(); // Display the stage // Register listeners cboLocale.setOnAction(e -> { locale = locales[cboLocale .getSelectionModel().getSelectedIndex()]; computeLoan(); }); btCompute.setOnAction(e -> computeLoan()); } /** Compute payments and display results locale-sensitive format */ private void computeLoan() { // Retrieve input from user double loan = new Double(tfLoanAmount.getText()).doubleValue(); double interestRate = new Double(tfInterestRate.getText()).doubleValue() / 1240; int numberOfYears = new Integer(tfNumberOfYears.getText()).intValue(); // Calculate payments double monthlyPayment = loan * interestRate/ (1 - (Math.pow(1 / (1 + interestRate), numberOfYears * 12))); double totalPayment = monthlyPayment * numberOfYears * 12; // Get formatters NumberFormat percentFormatter = NumberFormat.getPercentInstance(locale); NumberFormat currencyForm = NumberFormat.getCurrencyInstance(locale); NumberFormat numberForm = NumberFormat.getNumberInstance(locale); percentFormatter.setMinimumFractionDigits(2); // Display formatted input tfFormattedInterestRate.setText( percentFormatter.format(interestRate * 12)); tfFormattedNumberOfYears.setText (numberForm.format(numberOfYears)); tfFormattedLoanAmount.setText(currencyForm.format(loan)); // Display results in currency format tfMonthlyPayment.setText(currencyForm.format(monthlyPayment)); tfTotalPayment.setText(currencyForm.format(totalPayment)); } /** * The main method is only needed for the IDE with limited * JavaFX support. Not needed for running from the command line. */ public static void main(String[] args) { launch(args); } }