Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak sformatować liczbę z przecinkiem w Oracle

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przykład replikacji strumieni Oracle krok po kroku

  2. Dlaczego otrzymuję wyjątek OutOfRange w funkcji GetOrdinal tego pola CLOB?

  3. Jak zaimplementować pobieranie wsadowe za pomocą Fluent NHibernate podczas pracy z Oracle?

  4. 12c Redakcja danych

  5. Czy jest jakaś różnica między !=i <> w Oracle Sql?