Pertemuan 6 - APLIKASI CURRENCY CONVERTER

Nama              : Armadya Hermawan Sarwono

NRP                : 5025211243

Kelas               : PPB - A

 fun CurrencyConverterApp(modifier: Modifier = Modifier) {

val mostTradedCurrencies = listOf(
"USD", "EUR", "JPY", "GBP", "AUD",
"CAD", "CHF", "CNY", "HKD", "IDR"
)

var amount by remember { mutableStateOf("") }
var fromCurrency by remember { mutableStateOf("USD") }
var toCurrency by remember { mutableStateOf("IDR") }
var result by remember { mutableStateOf("Result: ") }

Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.spacedBy(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Currency Converter", fontSize = 24.sp)

OutlinedTextField(
value = amount,
onValueChange = { amount = it },
label = { Text("Enter amount") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.fillMaxWidth()
)

Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
) {
CurrencyDropdown(
label = "From",
selectedCurrency = fromCurrency,
currencies = mostTradedCurrencies,
onCurrencySelected = { fromCurrency = it }
)
CurrencyDropdown(
label = "To",
selectedCurrency = toCurrency,
currencies = mostTradedCurrencies,
onCurrencySelected = { toCurrency = it }
)
}

Button(
onClick = {
val amountValue = amount.toDoubleOrNull()
result = if (amountValue != null) {
val converted = converter(amountValue, fromCurrency, toCurrency)
"Result: $converted $toCurrency"
} else {
"Invalid input"
}
},
modifier = Modifier.fillMaxWidth()
) {
Text("Convert")
}

Text(result, fontSize = 20.sp)
}
}

CurrencyConverterApp merupakan fungsi utama yang membentuk antarmuka aplikasi konversi mata uang. Komponen ini menampilkan elemen-elemen seperti judul, kolom input untuk nominal uang, dua dropdown untuk memilih mata uang asal dan tujuan, tombol konversi, serta teks hasil konversi. Daftar mata uang yang tersedia meliputi 10 mata uang paling umum diperdagangkan (misalnya USD, EUR, JPY, IDR). Seluruh data seperti nominal (amount), mata uang asal (fromCurrency), mata uang tujuan (toCurrency), dan hasil (result) disimpan dalam state agar UI dapat memperbarui tampilan secara dinamis. Saat pengguna menekan tombol “Convert”, aplikasi akan mencoba mengubah input menjadi angka, lalu menggunakan fungsi converter() untuk menghitung hasil konversi dan menampilkannya.

fun CurrencyDropdown(
label: String,
selectedCurrency: String,
currencies: List<String>,
onCurrencySelected: (String) -> Unit
) {
var expanded by remember { mutableStateOf(false) }

Column(modifier = Modifier.width(150.dp)) {
Text(label)
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = !expanded }
) {
OutlinedTextField(
value = selectedCurrency,
onValueChange = {},
readOnly = true,
modifier = Modifier.menuAnchor(),
trailingIcon = {
ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded)
}
)

ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
currencies.forEach { currency ->
DropdownMenuItem(
text = { Text(currency) },
onClick = {
onCurrencySelected(currency)
expanded = false
}
)
}
}
}
}
}

CurrencyDropdown adalah komponen reusable yang menampilkan menu dropdown untuk memilih salah satu mata uang. Fungsi ini menerima label penanda, mata uang yang sedang dipilih, daftar semua mata uang, dan callback ketika pilihan berubah. Komponen ini memanfaatkan elemen ExposedDropdownMenuBox untuk membungkus OutlinedTextField sebagai pemicu dropdown dan daftar pilihan di dalam ExposedDropdownMenu. Dropdown akan terbuka ketika diklik dan akan menutup secara otomatis setelah pengguna memilih salah satu mata uang. Komponen ini dirancang modular agar dapat digunakan kembali di berbagai bagian aplikasi.

fun converter(nominal: Double, fromCurrency: String, toCurrency: String): String {
val ratesInUSD = mapOf(
"USD" to 1.0,
"EUR" to 1.08,
"GBP" to 1.29,
"JPY" to 0.0067,
"AUD" to 0.66,
"CAD" to 0.74,
"CHF" to 1.12,
"CNY" to 0.14,
"HKD" to 0.13,
"IDR" to 0.0000596
)

val amount = if (fromCurrency == toCurrency) {
nominal
} else {
val amountInUSD = nominal * (ratesInUSD[fromCurrency] ?: 1.0)
amountInUSD / (ratesInUSD[toCurrency] ?: 1.0)
}

val symbols = DecimalFormatSymbols().apply {
groupingSeparator = '.'
decimalSeparator = ','
}

val formatter = DecimalFormat("#,###.##", symbols)
return formatter.format(amount)

Fungsi converter digunakan untuk menghitung hasil konversi dari satu mata uang ke mata uang lainnya. Konversi dilakukan menggunakan nilai tukar relatif terhadap USD yang disimpan dalam map ratesInUSD. Jika mata uang asal dan tujuan sama, nilai dikembalikan tanpa perubahan. Jika berbeda, nominal akan dikonversi terlebih dahulu ke USD, lalu ke mata uang tujuan. Hasil akhir kemudian diformat agar lebih mudah dibaca, menggunakan simbol pemisah ribuan dan desimal yang sesuai dengan format lokal.

Comments

Popular posts from this blog

ETS PPB

EAS PBB

Pertemuan 10 - APLIKASI WORD SCRAMBLE