Saat Anda menggunakan TO_CHAR()
fungsi untuk memformat angka di Oracle, Anda menggunakan model format untuk menentukan bagaimana angka harus diformat.
Misalnya, Anda dapat memformat angka seperti 12,345.00
atau seperti 12.345,00
, tergantung pada lokal Anda.
Model format dapat menyertakan G
atau D
elemen format untuk menambahkan koma ke angka. Yang mana yang Anda gunakan bergantung pada apakah Anda ingin koma sebagai pemisah ribuan, atau sebagai karakter desimal.
Atau, Anda dapat menggunakan karakter koma yang sebenarnya (,
) jika Anda mau, meskipun metode ini tidak mengenali lokal seperti G
dan D
elemen format adalah.
G
dan D
Elemen Format
Berikut adalah contoh untuk mendemonstrasikan G
dan D
elemen format:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Hasil:
12,345.00
Dalam hal ini, pemisah grup mengeluarkan koma, dan karakter desimal mengeluarkan titik. Itu karena NLS_TERRITORY
sesi saya saat ini parameter disetel ke Australia
.
Inilah yang terjadi jika saya mengubah NLS_TERRITORY
saya parameter ke Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Hasil:
12.345,00
Sekarang koma digunakan untuk karakter desimal.
Sebagai penjelasan singkat dari model format di atas:
fm
pengubah format menekan setiap padding yang mungkin diterapkan pada hasil.9
karakter mewakili angka.0
karakter mewakili angka tanpa menekan nol di depan atau di belakang.
Berikut daftar lengkap elemen format angka yang dapat Anda gunakan sebagai referensi cepat.
Tdia NLS_NUMERIC_CHARACTERS
Parameter
Saat kita menyetel NLS_TERRITORY
parameter (seperti pada contoh sebelumnya), ini secara implisit menetapkan sekelompok parameter lain, termasuk NLS_NUMERIC_CHARACTERS
parameter.
Tdia NLS_NUMERIC_CHARACTERS
parameter menentukan karakter mana yang digunakan untuk pemisah grup dan karakter desimal.
Kita dapat menanyakan V$NLS_PARAMETERS
tampilan untuk melihat karakter mana yang digunakan untuk pemisah grup dan karakter desimal:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Hasil:
,.
Di sini kita melihat bahwa karakter desimal dilambangkan dengan koma, dan pemisah grup dilambangkan dengan titik.
Anda dapat mengubah nilai NLS_NUMERIC_CHARACTERS
parameter secara langsung jika Anda mau (yaitu tanpa mengubah NLS_TERRITORY
parameter).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Hasil:
12,345.00
Tetapi Anda mungkin harus menghindari melakukan ini, karena ini menyebabkan pemutusan antara parameter NLS. Parameter NLS Anda tidak lagi mencerminkan nilai default untuk wilayah saat ini. Kecuali Anda memiliki alasan kuat untuk tidak melakukannya, biasanya lebih baik mengubah NLS_TERRITORY
parameter ke wilayah yang relevan, sehingga parameter lain juga dapat diperbarui ke default untuk wilayah baru.
'nlsparam'
Argumen
Satu hal yang harus saya sebutkan adalah bahwa T0_CHAR()
function menerima argumen ketiga yang memungkinkan Anda menyetel berbagai parameter NLS untuk sementara, termasuk NLS_NUMERIC_CHARACTERS
parameter. Saat Anda melakukan ini di tingkat fungsi, itu tidak mengubah nilai parameter tersebut untuk sesi saat ini.
Ini contohnya:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT
TO_CHAR(12345, 'fm99G999D00') AS "r1",
TO_CHAR(
12345, 'fm99G999D00',
'NLS_NUMERIC_CHARACTERS = ''.,'''
) AS "r2",
TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL;
Hasil:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Di sini, saya mengatur wilayah sesi ke Jerman, dan kemudian memanggil TO_CHAR()
tiga kali.
- Panggilan pertama menggunakan parameter NLS sesi. Ini berarti pemisah grup default adalah titik.
- Pada panggilan kedua, saya secara eksplisit mengatur
NLS_NUMERIC_CHARACTERS
saya sendiri parameter dari dalam fungsi. Dalam hal ini, saya mengatur pemisah grup menjadi koma. Melakukan hal ini tidak memengaruhi parameter NLS sesi saya, seperti yang terlihat pada panggilan ketiga. - Panggilan ketiga menggunakan parameter NLS sesi, sama seperti panggilan pertama. Seperti yang kita lihat, pemisah grup dan karakter desimal tidak terpengaruh oleh perubahan (sementara) yang kita lakukan di panggilan kedua.
Koma yang Di-hardcode
Cara lain untuk menambahkan koma ke angka adalah dengan mengkodekannya ke dalam model format Anda.
Contoh:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Hasil:
12,345.00
Dalam hal ini saya hardcoded koma dan titik. Melakukan hal ini mengabaikan pemisah grup yang disetel di NLS_NUMERIC_CHARACTERS
parameter.
Beberapa Koma
Anda dapat memiliki beberapa pemisah koma dan/atau grup dalam model format.
Contoh:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Hasil:
123,456,789.00
Penempatan Koma Tidak Valid
Pemisah koma atau grup tidak boleh muncul di sebelah kanan karakter desimal atau titik dalam model format angka.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Hasil:
Error report - ORA-01481: invalid number format model