What is the significance of the currency converter java?
This is my basic currency converter for my intro to Java class. I'm supposed to be able to convert between Yen, Dollars, Pounds and Euros using static rates. It works, but I was curious to know if I did it in the most efficient way possible. It seems quite long and looks like a huge mess. Just wanting some feedback.
import java.util.Scanner; public class currency { public currency() { char us_dollar_sym = 36; char pound_sym = 163; char yen_sym = 165; char euro_sym = 8364; String us_dollar = "Dollars"; String pound = "Pounds"; String yen = "Yen"; String euro = "Euros"; double rate = 0; // Interface System.out.println("Welcome to the Currency Converter Program n"); System.out.println("Use the following codes to input your currency choices: n 1 - US dollars n 2 - Euros n 3 - British Pounds n 4 - Japanese Yen n"); // System.out.println("Please choose the input currency:"); Scanner in = new Scanner(System.in); int choice = in.nextInt(); String inType = null; switch(choice) { case 1: inType = "US Dollars >> " + us_dollar_sym; break; case 2: inType = "Euros >> " + euro_sym; break; case 3: inType = "British Pounds >> " + pound_sym; break; case 4: inType = "Japanese Yen >> " + yen_sym; break; default:
Regarding the currency converter java, your assessment of your own code is pretty close to accurate: it seems quite long and looks like a huge mess.
On the other hand, you have worked through what appear to be all the use cases, and you have comprehensively solved the problem. You have put a lot of work into manually building out a logic tree, and calculation system, to get the conversions right. Frankly, you have done so much of it by hand, that there's little left for the system to compute. Your determination is commendable.
Addressing the mess first. A simple re-formatting of the code would do wonders for it. I took the liberty of using Eclipse, and running it through the auto-formatter:
import java.util.Scanner; public class currency { public currency() { char us_dollar_sym = 36; char pound_sym = 163; char yen_sym = 165; char euro_sym = 8364; String us_dollar = "Dollars"; String pound = "Pounds"; String yen = "Yen"; String euro = "Euros"; double rate = 0; // Interface System.out.println("Welcome to the Currency Converter Program
"); System.out .println("Use the following codes to input your currency choices:
1 - US dollars
2 - Euros
3 - British Pounds
4 - Japanese Yen
"); // System.out.println("Please choose the input currency:"); Scanner in = new Scanner(System.in); int choice = in.nextInt(); String inType = null; switch (choice) { case 1: inType = "US Dollars >> " + us_dollar_sym; break; case 2: inType = "Euros >> " + euro_sym; break; case 3: inType = "British Pounds >> " + pound_sym; break; case 4: inType = "Japanese Yen >> " + yen_sym; break; default: System.out .println("Please restart the program & enter a number from the list."); return; } System.out.println("Please choose the output currency"); int output = in.nextInt(); System.out.printf("Now enter the input in " + inType); double input = in.nextDouble(); if (choice == output) System.out.println("Same currency no need to convert"); if (choice == 1 && output == 2) { double dollar_euro_rate = 0.78391; rate = input * dollar_euro_rate; System.out.printf("%s" + input + " at a conversion rate of " + dollar_euro_rate + " Dollars to %s = %.2f
", (char) us_dollar_sym, euro, rate); } else if (choice == 1 && output == 3) { double dollar_pound_rate = 0.621484; rate = input * dollar_pound_rate; System.out.printf("%s" + input + " at a conversion rate of " + dollar_pound_rate + " Dollars to %s = %.2f
", (char) us_dollar_sym, pound, rate); } else if (choice == 1 && output == 4) { double dollar_yen_rate = 107.174; rate = input * dollar_yen_rate; System.out.printf("%s" + input + " at a conversion rate of " + dollar_yen_rate + " Dollars to %s = %.2f
", (char) us_dollar_sym, yen, rate); } if (choice == 2 && output == 1) { double euro_dollar_rate = 1.27579; rate = input * euro_dollar_rate; System.out.printf("%s" + input + " at a conversion rate of " + euro_dollar_rate + " Euros to %s = %.2f
", (char) euro_sym, us_dollar, rate); } else if (choice == 2 && output == 3) { double euro_pound_rate = 0.792648; rate = input * euro_pound_rate; System.out.printf("%s" + input + " at a conversion rate of " + euro_pound_rate + " Euros to %s = %.2f
", (char) euro_sym, pound, rate); } else if (choice == 2 && output == 4) { double euro_yen_rate = 136.708; rate = input * euro_yen_rate; System.out.printf("%s" + input + " at a conversion rate of " + euro_yen_rate + " Euros to %s = %.2f
", (char) euro_sym, yen, rate); } if (choice == 3 && output == 1) { double pound_dollar_rate = 1.60972; System.out.printf("%s" + input + " at a conversion rate of " + pound_dollar_rate + " Pounds to %s = %.2f
", (char) pound_sym, us_dollar, rate); } else if (choice == 3 && output == 2) { double pound_euro_rate = 1.26161; System.out.printf("%s" + input + " at a conversion rate of " + pound_euro_rate + " Pounds to %s = %.2f
", (char) pound_sym, euro, rate); } else if (choice == 3 && output == 4) { double pound_yen_rate = 172.511; System.out.printf("%s" + input + " at a conversion rate of " + pound_yen_rate + " Pounds to %s = %.2f
", (char) pound_sym, yen, rate); } if (choice == 4 && output == 1) { double yen_dollar_rate = 0.00932574; System.out.printf("%s" + input + " at a conversion rate of " + yen_dollar_rate + " Yen to %s = %.2f
", (char) yen_sym, us_dollar, rate); } else if (choice == 4 && output == 2) { double yen_euro_rate = 0.00730615; System.out.printf("%s" + input + " at a conversion rate of " + yen_euro_rate + " Yen to %s = %.2f
", (char) yen_sym, euro, rate); } else if (choice == 4 && output == 3) { double yen_pound_rate = 0.00579135; System.out.printf("%s" + input + " at a conversion rate of " + yen_pound_rate + " Yen to %s = %.2f
", (char) yen_sym, pound, rate); } System.out.println("Thank you for using the currency converter"); } }
OK, let's go through that:
Java classes should have a capital letter for the name. Call it 'Currency'.
Java is object oriented, which means you should actually have objects. You have none, and you embed all the logic in the constructor of the class... not good.
You repeat yourself a lot
You repeat yourself a lot
You repeat yourself a lot
Let's work on a strategy, without rewriting the whole thing for you. Let's start with a currency conversion tool that is object oriented. The first object is a currency, called Currency.
public class Currency { }
Now, with any conversion tool, the trick is to have as little redundancy as possible. The way to do it in this case is to have a common currency, and the exchange rates from all the other currencies to the common one. Since you list USD as the first currency, we will go with that, and the following table:
USD USD 1.0 Euro 0.78391 GBP 0.621484 Yen 107.174
Now, we flesh out each currency to have the rate to the common currency:
public class Currency { private final String name; private final double rate; public Currency(String name, double rate) { this.name = name; this.rate = rate; } }
Then, create instances (in an array?) like:
Currency[] currencies = { new Currency("USD", 1.0), new Currency("Euro", 0.78391), .... };
Now, if we want to convert from Euro to Yen, we first convert from Euro to USD, then USD to Yen. You can do it by dividing the exchange rates:
Do some user input:
double sourceAmount = ....; // some source amount String sourceCurrency = ...; // some currency String targetCurrency = ....; // you get the idea.
Search the Currency instances for the right rates:
double rateToDollars = ....; // find the rate from source to dollars (may be 1.0). double rateToTarget = ....; // find the rate from target to dollars (may be 1.0)
calculate the converted amount:
double targetAmount = (sourceAmount / rateToDollars) * rateToTarget;
That about sums up what the code should look like.