Memformat tanggal dan angka di Swift bisa dilakukan lewat DateFormatter, NumberFormatter, atau API FormatStyle yang lebih baru. Pilihan yang tepat bergantung pada apakah teks hasil format perlu dipakai berulang, digabung dengan string lain, atau langsung dipakai di tampilan SwiftUI.
Ketiganya berbeda pada tempat pemakaian dan cara hasilnya dipakai.
Ringkasan perbandingan tiga pendekatan
| Aspek | DateFormatter / NumberFormatter | FormatStyle |
|---|---|---|
| Gaya API | Objek kelas, mutable | Struct nilai, immutable |
| Ketersediaan | Sejak Foundation lama | iOS 15, macOS 12 ke atas |
| Cocok untuk | Kode lama, format kustom rumit, cache manual | Tampilan SwiftUI, format terdeklarasi, kode baru |
| Perilaku default | Mengikuti locale perangkat saat dibuat tanpa konfigurasi | Mengikuti environment locale saat render |
| Biaya pembuatan | Relatif mahal, sebaiknya di-cache | Ringan, cukup dideklarasikan |
DateFormatter untuk format kustom yang rumit
DateFormatter masih pilihan waras ketika kamu punya pola tanggal yang tidak bisa diungkapkan lewat format standar, misalnya label ringkas seperti 06 Nov 2026 dengan pemisahan khusus. Kamu mendefinisikan pola lewat string seperti dd MMM yyyy, lalu memanggil string(from:).
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "id_ID")
formatter.dateFormat = "dd MMM yyyy"
let label = formatter.string(from: Date())
// contoh hasil: 06 Nov 2026
Membuat DateFormatter berulang di dalam loop atau body view membuang waktu. Simpan sebagai properti statis agar dibuat sekali. Kalau kamu memformat tanggal di banyak tempat dengan pola berbeda, kelola cache-nya dengan rapi supaya tidak ada formatter baru setiap pemanggilan.
FormatStyle untuk tanggal di SwiftUI
Mulai iOS 15, Swift menyediakan API FormatStyle yang lebih ringkas dipakai di view. Kamu menulis date.formatted(.dateTime.day().month().year()) dan Swift mengurus locale, urutan komponen, serta pemisah sesuai pengaturan pengguna.
let sekarang = Date()
let lengkap = sekarang.formatted(date: .long, time: .omitted)
let ringkas = sekarang.formatted(.dateTime.day().month(.abbreviated))
FormatStyle tidak menyimpan state di objek kelas, jadi aman dipakai di body SwiftUI saat pengguna mengganti bahasa sistem. Format mengikuti environment, sehingga tampilan berubah tanpa kode tambahan. Ini juga membantu kalau kamu mengerjakan aplikasi macOS, karena perilaku formatnya serupa di kedua platform.
NumberFormatter dan FormatStyle untuk angka
Untuk angka, NumberFormatter adalah padanan lama yang juga masih dipakai. Kamu bisa mengatur jumlah desimal, pemisah ribuan, dan simbol mata uang lewat properti. Seperti DateFormatter, objek ini sebaiknya di-cache.
FormatStyle menyediakan cara yang lebih langsung: 1234567.891.formatted(.number.precision(.fractionLength(2))) atau harga.formatted(.currency(code: "IDR")). Untuk kebutuhan mata uang, API ini sudah menangani penempatan simbol dan jumlah desimal default per wilayah, jadi kamu tidak perlu merakit format manual.
Format angka yang mengikuti locale pengguna bisa membingungkan kalau angka itu dipakai untuk input. Pemisah ribuan dan koma desimal yang berbeda antar wilayah sebaiknya tidak dimasukkan ke field yang kemudian di-parse kembali. Simpan angka mentah, format hanya saat menampilkan.
Kapan tetap memakai formatter kelas
Ada beberapa kondisi di mana DateFormatter atau NumberFormatter lebih praktis:
- Format sangat kustom yang tidak bisa diungkapkan lewat komponen FormatStyle, misalnya string dengan sisipan teks tetap.
- Kode lama yang sudah stabil dan tidak mau diubah hanya demi keseragaman API.
- Format yang perlu di-parse kembali, karena banyak pola parsing masih lebih mudah ditulis lewat formatter kelas.
- Target deployment di bawah iOS 15 atau macOS 12.
Kalau aplikasimu menargetkan versi OS yang lebih lama, FormatStyle tidak tersedia dan kode perlu jalur fallback. Pertimbangkan hal ini saat menulis kode yang dipakai bersama di banyak target.
Kesalahan umum yang perlu dihindari
Membuat formatter baru setiap kali fungsi dipanggil adalah penyebab lambat yang sering tidak terlihat. Pada daftar panjang, pemformatan tanggal di setiap baris bisa menambah beban yang tidak perlu.
Kesalahan kedua adalah mengandalkan format default tanpa memikirkan locale. Pengguna di wilayah berbeda akan melihat urutan tanggal yang berbeda pula. Jika tampilanmu memakai format tetap untuk alasan desain, kunci locale secara eksplisit dan pastikan itu keputusan sadar.
Kesalahan ketiga muncul di aplikasi yang menampilkan data dari server. Tanggal ISO 8601 dari API sebaiknya di-parse dulu menjadi Date, baru diformat untuk tampilan. Jangan mengoper string mentah langsung ke DateFormatter dengan asumsi formatnya cocok.
Saat membangun fitur yang menampilkan jadwal, riwayat transaksi, atau ringkasan aktivitas, format tanggal sering bersinggungan dengan cara data disimpan dan disinkronkan. Kalau aplikasimu menyimpan data secara lokal dan sesekali menyegarkan dari server, perbandingan offline mode vs sinkronisasi cloud di aplikasi iOS membahas kapan konflik waktu bisa muncul dan cara menanganinya.
Untuk aplikasi yang memuat data pengguna, pemformatan yang rapi juga membantu saat pengguna memeriksa data mereka sendiri. Kalau aplikasimu menyimpan email atau identitas, sediakan panduan ringkas tentang cara memeriksa kebocoran data pribadi dan mengatasinya agar pengguna tahu langkah yang bisa diambil.
Saat menguji tampilan format di perangkat atau server berbeda, cek juga koneksi dan latensi dengan panduan cek ping dari berbagai lokasi supaya hasil uji tidak salah disimpulkan sebagai bug pemformatan.
Di sela pengujian, pengguna dan tim kadang butuh hiburan ringan. Bagi yang menyukai basket, sepakbola, atau UFC, menonton bareng secara gratis dengan host yang menghibur bisa jadi pilihan di tarkamlive ketika jeda build sedang panjang.
Ringkasan pilihan
Untuk kode baru yang berjalan di iOS 15 ke atas, FormatStyle adalah default yang masuk akal karena ringkas, aman di SwiftUI, dan mengikuti locale pengguna. DateFormatter dan NumberFormatter tetap relevan untuk format kustom rumit, parsing, atau target OS lama. Simpan formatter kelas sebagai nilai statis dan biarkan FormatStyle menangani tampilan yang dinamis.
Pertanyaan yang Sering Diajukan
Apakah FormatStyle bisa dipakai untuk format tanggal yang sepenuhnya kustom?
Sebagian besar kebutuhan umum bisa diungkapkan lewat kombinasi komponen, tapi pola dengan sisipan teks tetap atau urutan tidak lazim biasanya lebih mudah ditulis dengan DateFormatter dan string pola.
Kenapa tanggal di aplikasi saya berubah urutan saat bahasa perangkat diganti?
Karena format mengikuti locale. Jika urutan harus tetap untuk alasan desain, kunci locale secara eksplisit di formatter atau gunakan format dengan komponen yang sudah diurutkan sendiri.
Apakah NumberFormatter masih layak dipakai di proyek baru?
Layak untuk kasus yang butuh parsing angka atau konfigurasi rinci. Untuk sekadar menampilkan angka dan mata uang, API FormatStyle lebih ringkas dan tidak perlu dikelola cache-nya secara manual.
More Stories
State Management di SwiftUI: Observable vs Environment di Aplikasi
Async/Await vs Combine vs Callback di Swift: Panduan Memilih
7 Cara Mengelola State di SwiftUI: Perbandingan untuk iOS