Gdy używasz TO_CHAR()
funkcji formatowania liczby w Oracle, używasz modelu formatu, aby określić, jak liczba powinna być sformatowana.
Na przykład możesz sformatować liczbę w stylu 12,345.00
lub jak 12.345,00
, w zależności od regionu.
Model formatu może zawierać G
lub D
elementy formatu, aby dodać przecinek do liczby. To, którego użyjesz, zależy od tego, czy chcesz przecinek jako separator tysięcy, czy jako znak dziesiętny.
Alternatywnie możesz użyć rzeczywistego znaku przecinka (,
), jeśli wolisz, chociaż ta metoda nie uwzględnia ustawień regionalnych, tak jak G
i D
elementy formatu są.
G
i D
Formatuj elementy
Oto przykład demonstrujący G
i D
elementy formatu:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Wynik:
12,345.00
W takim przypadku separator grup wyprowadza przecinek, a znak dziesiętny wyprowadza kropkę. To dlatego, że NLS_TERRITORY
mojej obecnej sesji parametr jest ustawiony na Australia
.
Oto, co się stanie, jeśli zmienię moje NLS_TERRITORY
parametr do Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Wynik:
12.345,00
Teraz przecinek jest używany jako znak dziesiętny.
Jako szybkie wyjaśnienie powyższego modelu formatu:
fm
modyfikator formatu blokuje wszelkie dopełnienie, które może zostać zastosowane do wyniku.9
znaki reprezentują liczby.0
znak reprezentuje liczby bez pomijania zer wiodących lub końcowych.
Oto pełna lista elementów formatu liczb, których możesz użyć jako szybkiego odniesienia.
Ton NLS_NUMERIC_CHARACTERS
Parametr
Kiedy ustawimy NLS_TERRITORY
parametr (jak w poprzednim przykładzie), to niejawnie ustawia kilka innych parametrów, w tym NLS_NUMERIC_CHARACTERS
parametr.
Ton NLS_NUMERIC_CHARACTERS
parametr określa, które znaki są używane jako separator grup i znak dziesiętny.
Możemy zapytać o V$NLS_PARAMETERS
zobacz, które znaki są używane jako separator grup i znak dziesiętny:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Wynik:
,.
Widzimy tutaj, że znak dziesiętny jest reprezentowany przez przecinek, a separator grup jest reprezentowany przez kropkę.
Możesz zmienić wartość NLS_NUMERIC_CHARACTERS
parametr bezpośrednio, jeśli chcesz (tj. bez zmiany NLS_TERRITORY
parametr).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Wynik:
12,345.00
Ale prawdopodobnie powinieneś tego unikać, ponieważ powoduje to rozłączenie parametrów NLS. Twoje parametry NLS nie odzwierciedlają już wartości domyślnych dla bieżącego terytorium. Jeśli nie masz dobrego powodu, aby tego nie robić, zwykle lepiej zmienić NLS_TERRITORY
parametr do odpowiedniego terytorium, aby inne parametry również mogły zostać zaktualizowane do ich wartości domyślnych dla nowego terytorium.
'nlsparam'
Argument
Jedną rzeczą, o której powinienem wspomnieć, jest to, że T0_CHAR()
funkcja przyjmuje trzeci argument, który umożliwia tymczasowe ustawienie różnych parametrów NLS, w tym NLS_NUMERIC_CHARACTERS
parametr. Kiedy robisz to na poziomie funkcji, nie zmienia to wartości tych parametrów dla bieżącej sesji.
Oto przykład:
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;
Wynik:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Tutaj ustawiłem terytorium sesji na Niemcy, a następnie wywołałem TO_CHAR()
trzy razy.
- Pierwsze wywołanie używa parametrów NLS sesji. Oznacza to, że domyślnym separatorem grup jest kropka.
- W drugim wywołaniu jawnie ustawiłem własne
NLS_NUMERIC_CHARACTERS
parametr z poziomu funkcji. W tym przypadku ustawiam separatorem grupy jako przecinek. Zrobienie tego nie wpłynęło na parametry NLS mojej sesji, jak widać po trzecim wywołaniu. - Trzecie wywołanie wykorzystuje parametry NLS sesji, podobnie jak pierwsze wywołanie. Jak widać, na separator grup i znak dziesiętny nie wpłynęła (tymczasowa) zmiana, którą wprowadziliśmy w naszym drugim wywołaniu.
Ustalony przecinek
Innym sposobem dodania przecinka do liczby jest zakodowanie jej na stałe w modelu formatu.
Przykład:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Wynik:
12,345.00
W tym przypadku na stałe zakodowałem przecinek i kropkę. Spowoduje to zignorowanie separatora grupy ustawionego w NLS_NUMERIC_CHARACTERS
parametr.
Wiele przecinków
W modelu formatu możesz mieć wiele przecinków i/lub separatorów grup.
Przykład:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Wynik:
123,456,789.00
Nieprawidłowe umieszczenie przecinka
Separator przecinka lub grupy nie może pojawić się po prawej stronie znaku dziesiętnego lub kropki w modelu formatu liczb.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Wynik:
Error report - ORA-01481: invalid number format model