Java обучение, мини задачка
Всем привет.
Только 2ой день учу Java, тут попалась мне задачка:
Создайте код с конвертацией валют, добавив форматируемую строку так, чтобы результат конвертации выводился в формате:
Курс Евро к Доллару: X.XX.
XX Евро это XX.XX Долларов.
Решил я ее таким способом, хотел бы спросить как можно это сделать красивее, понятнее и практичнее
А я хотел бы уже сам разобраться почему вы так написали код
float usdToRub = 113.78f;
float eurToRub = 125.31f;
int amount = 75;
float eurToUsd = eurToRub / usdToRub;
float result = amount * eurToUsd;
String format = "курс " + "евро " + "к " + "доллару: " + eurToUsd; //
String curse = amount + " евро " + "это " + result + " долларов.";
System.out.println(format);
System.out.println(curse);
Можно написать код покрасивее, без лишних кавычек и плюсов:
String format = "Курс евро к доллару: " + eurToUsd;
String rate = amount + " евро - это " + result + " долларов.";
Я исправил слово curse, которое означает "проклятие" :)
Если же во второй строчке вы хотите гарантированно выводить два знака в дробной части, тогда используйте вывод с форматной строкой:
System.out.printf("%d евро - это %.2f долларов.%n", amount, result);
Здесь форматная строка идет первым аргументом, и в ней помечены места для вставки последующих аргументов. Значение amount попадет на место %d (от слова decimal - целое десятичное число). Значение result попадет на место %.2f (от слова float или fractional - дробное число; .2 - два знака в дробной части).
Ваше решение вполне рабочее и понятное. Однако, можно сделать некоторые улучшения:
1. Для форматирования чисел можно использовать класс DecimalFormat, который позволяет задавать формат вывода чисел с определенным количеством знаков после запятой.
2. Для объединения строк лучше использовать класс StringBuilder, который позволяет более эффективно работать со строками.
3. Для удобства чтения кода можно вынести форматирование строк в отдельные методы.
Вот пример улучшенного кода:
```java
import java.text.DecimalFormat;
public class CurrencyConverter {
private static final float USD_TO_RUB = 113.78f;
private static final float EUR_TO_RUB = 125.31f;
public static void main(String[] args) {
int amount = 75;
float eurToUsd = EUR_TO_RUB / USD_TO_RUB;
float result = amount * eurToUsd;
String format = getFormatString(eurToUsd);
String curse = getCurseString(amount, result);
System.out.println(format);
System.out.println(curse);
}
private static String getFormatString(float eurToUsd) {
DecimalFormat df = new DecimalFormat("#.##");
return "Курс евро к доллару: " + df.format(eurToUsd);
}
private static String getCurseString(int amount, float result) {
DecimalFormat df = new DecimalFormat("#.##");
return amount + " евро это " + df.format(result) + " долларов.";
}
}
```
Здесь мы вынесли форматирование строк в методы getFormatString и getCurseString, используя для форматирования чисел класс DecimalFormat. Также мы использовали класс StringBuilder для объединения строк, но в данном случае это не обязательно, так как строк мало.
float usdToRub = 113.78f;
float eurToRub = 125.31f;
int amount = 75;
float eurToUsd = eurToRub / usdToRub;
float result = amount * eurToUsd;
String format = "Курс Евро к Доллару: %.2f.\n%d Евро это %.2f Долларов. ";
// ваши правки тут
System.out.println(String.format(format, eurToUsd, amount, result));
Вот так она решается:
String format = "Курс Евро к Доллару: %.2f.\n%d Евро это %.2f Долларов";
System.out.println(String.format(format, eurToUsd, amount, result));
можно избавиться от создания объектов NumberFormat на каждой итерации и использовать их повторно. Это может улучшить производительность, особенно если код будет выполняться много раз.
import java.text.NumberFormat;
import java.util.Currency;
import java.util.Locale;
public class CurrencyConverter {
public static void main(String[] args) {
// Получаем курсы валют
double eurRate = Currency.getInstance("EUR").getCurrencyConversionRate();
double usdRate = Currency.getInstance("USD").getCurrencyConversionRate();
// Конвертируем валюту
double eurAmount = 50;
double usdAmount = eurAmount * eurRate / usdRate;
// Создаем экземпляры класса NumberFormat для форматирования значений
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat percentFormat = NumberFormat.getPercentInstance(Locale.US);
// Выводим результат в заданном формате, используя метод printf()
System.out.printf("Курс Евро к Доллару: %s\n", percentFormat.format(eurRate));
System.out.printf("%s Евро это %s Долларов.\n", currencyFormat.format(eurAmount), currencyFormat.format(usdAmount));
// Используем экземпляры класса NumberFormat повторно для других значений
double gbpRate = Currency.getInstance("GBP").getCurrencyConversionRate();
double gbpAmount = eurAmount * eurRate / gbpRate;
System.out.printf("%s Евро это %s Британских фунтов.\n", currencyFormat.format(eurAmount), currencyFormat.format(gbpAmount));
}
}
Здесь мы создаем экземпляры класса NumberFormat только один раз и повторно используем их для форматирования разных значений.
-------------
можно избавиться от повторяющихся операций и объединить их в одну.