1  import java.awt.*;
  2  import java.awt.event.*;
  3  import javax.swing.*;
  4  import javax.swing.border.*;
  5  import java.util.*;
  6  import java.text.NumberFormat;
  7  
  8  public class NumberFormatDemo extends JApplet {
  9    // Combo box for selecting available locales
 10    private JComboBox jcboLocale = new JComboBox();
 11  
 12    // Text fields for interest rate, year, and loan amount
 13    private JTextField jtfInterestRate = new JTextField("6.75");
 14    private JTextField jtfNumberOfYears = new JTextField("15");
 15    private JTextField jtfLoanAmount = new JTextField("107000");
 16    private JTextField jtfFormattedInterestRate = new JTextField(10);
 17    private JTextField jtfFormattedNumberOfYears = new JTextField(10);
 18    private JTextField jtfFormattedLoanAmount = new JTextField(10);
 19  
 20    // Text fields for monthly payment and total payment
 21    private JTextField jtfTotalPayment = new JTextField();
 22    private JTextField jtfMonthlyPayment = new JTextField();
 23  
 24    // Compute button
 25    private JButton jbtCompute = new JButton("Compute");
 26  
 27    // Current locale
 28    private Locale locale = Locale.getDefault();
 29  
 30    // Declare locales to store available locales
 31    private Locale locales[] = Calendar.getAvailableLocales();
 32  
 33    /** Initialize the combo box */
 34    public void initializeComboBox() {
 35      // Add locale names to the combo box
 36      for (int i = 0; i < locales.length; i++)
 37        jcboLocale.addItem(locales[i].getDisplayName());
 38    }
 39  
 40    /** Initialize the applet */
 41    public void init() {
 42      // Panel p1 to hold the combo box for selecting locales
 43      JPanel p1 = new JPanel();
 44      p1.setLayout(new FlowLayout());
 45      p1.add(jcboLocale);
 46      initializeComboBox();
 47      p1.setBorder(new TitledBorder("Choose a Locale"));
 48  
 49      // Panel p2 to hold the input
 50      JPanel p2 = new JPanel();
 51      p2.setLayout(new GridLayout(3, 3));
 52      p2.add(new JLabel("Interest Rate"));
 53      p2.add(jtfInterestRate);
 54      p2.add(jtfFormattedInterestRate);
 55      p2.add(new JLabel("Number of Years"));
 56      p2.add(jtfNumberOfYears);
 57      p2.add(jtfFormattedNumberOfYears);
 58      p2.add(new JLabel("Loan Amount"));
 59      p2.add(jtfLoanAmount);
 60      p2.add(jtfFormattedLoanAmount);
 61      p2.setBorder(new TitledBorder("Enter Annual Interest Rate, " +
 62         "Number of Years, and Loan Amount"));
 63  
 64      // Panel p3 to hold the result
 65      JPanel p3 = new JPanel();
 66      p3.setLayout(new GridLayout(2, 2));
 67      p3.setBorder(new TitledBorder("Payment"));
 68      p3.add(new JLabel("Monthly Payment"));
 69      p3.add(jtfMonthlyPayment);
 70      p3.add(new JLabel("Total Payment"));
 71      p3.add(jtfTotalPayment);
 72  
 73      // Set text field alignment
 74      jtfFormattedInterestRate.setHorizontalAlignment(JTextField.RIGHT);
 75      jtfFormattedNumberOfYears.setHorizontalAlignment(JTextField.RIGHT);
 76      jtfFormattedLoanAmount.setHorizontalAlignment(JTextField.RIGHT);
 77      jtfTotalPayment.setHorizontalAlignment(JTextField.RIGHT);
 78      jtfMonthlyPayment.setHorizontalAlignment(JTextField.RIGHT);
 79  
 80      // Set editable false
 81      jtfFormattedInterestRate.setEditable(false);
 82      jtfFormattedNumberOfYears.setEditable(false);
 83      jtfFormattedLoanAmount.setEditable(false);
 84      jtfTotalPayment.setEditable(false);
 85      jtfMonthlyPayment.setEditable(false);
 86  
 87      // Panel p4 to hold result payments and a button
 88      JPanel p4 = new JPanel();
 89      p4.setLayout(new BorderLayout());
 90      p4.add(p3, BorderLayout.CENTER);
 91      p4.add(jbtCompute, BorderLayout.SOUTH);
 92  
 93      // Place panels to the applet
 94      add(p1, BorderLayout.NORTH);
 95      add(p2, BorderLayout.CENTER);
 96      add(p4, BorderLayout.SOUTH);
 97  
 98      // Register listeners
 99      jcboLocale.addActionListener(new ActionListener() {
100        @Override
101        public void actionPerformed(ActionEvent e) {
102          locale = locales[jcboLocale.getSelectedIndex()];
103          computeLoan();
104        }
105      });
106  
107      jbtCompute.addActionListener(new ActionListener() {
108        @Override
109        public void actionPerformed(ActionEvent e) {
110          computeLoan();
111        }
112      });
113    }
114  
115    /** Compute payments and display results locale-sensitive format */
116    private void computeLoan() {
117      // Retrieve input from user
118      double loan = new Double(jtfLoanAmount.getText()).doubleValue();
119      double interestRate =
120        new Double(jtfInterestRate.getText()).doubleValue() / 1240;
121      int numberOfYears =
122        new Integer(jtfNumberOfYears.getText()).intValue();
123  
124      // Calculate payments
125      double monthlyPayment = loan * interestRate/
126       (1 - (Math.pow(1 / (1 + interestRate), numberOfYears * 12)));
127      double totalPayment = monthlyPayment * numberOfYears * 12;
128  
129      // Get formatters
130      NumberFormat percentFormatter =
131        NumberFormat.getPercentInstance(locale);
132      NumberFormat currencyForm =
133        NumberFormat.getCurrencyInstance(locale);
134      NumberFormat numberForm = NumberFormat.getNumberInstance(locale);
135      percentFormatter.setMinimumFractionDigits(2);
136  
137      // Display formatted input
138      jtfFormattedInterestRate.setText(
139        percentFormatter.format(interestRate * 12));
140      jtfFormattedNumberOfYears.setText
141        (numberForm.format(numberOfYears));
142      jtfFormattedLoanAmount.setText(currencyForm.format(loan));
143  
144      // Display results in currency format
145      jtfMonthlyPayment.setText(currencyForm.format(monthlyPayment));
146      jtfTotalPayment.setText(currencyForm.format(totalPayment));
147    }
148  
149    /** Main method */
150    public static void main(String[] args) {
151      // Create a frame
152      JFrame frame = new JFrame("NumberFormatDemo");
153  
154      // Create an instance of the applet
155      NumberFormatDemo applet = new NumberFormatDemo();
156  
157      // Add the applet instance to the frame
158      frame.getContentPane().add(applet, BorderLayout.CENTER);
159  
160      // Invoke init() and start()
161      applet.init();
162      applet.start();
163  
164      // Display the frame
165      frame.setSize(400, 300);
166      frame.setLocationRelativeTo(null);
167      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
168      frame.setVisible(true);
169    }
170  }