sql >> Database >  >> RDS >> PostgreSQL

Getallen opmaken als valuta in PostgreSQL

Om een ​​getal als valuta in Postgres op te maken, kunt u het ofwel converteren naar het gegevenstype geld, of to_char() gebruiken om het te converteren naar tekst die het juiste valutasymbool bevat.

Dit veronderstelt uiteraard dat het nummer niet al is opgeslagen met het geldtype.

Hieronder staan ​​voorbeelden van elk van deze opties.

Omzetten in geld

Hier is een voorbeeld van het converteren van een getal naar het gegevenstype geld.

SELECT cast(12 as money);

Resultaat:

$12.00

Hier is nog een voorbeeld, dit keer met een grotere hoeveelheid.

SELECT cast(123456.78 as money);

Resultaat:

$123,456.78

Converteren vanuit een drijvende-kommagetal

Het wordt afgeraden om drijvende-kommagetallen te gebruiken om met geld om te gaan vanwege de kans op afrondingsfouten. Als u het echter moet doen, kunt u het eerst converteren naar numeriek en vervolgens naar geld.

SELECT '123456.78'::float8::numeric::money;

Resultaat:

$123,456.78

Als je probeert om rechtstreeks van drijvende komma naar geld te converteren, krijg je een foutmelding.

SELECT '123456.78'::float8::money;

Resultaat:

ERROR:  cannot cast type double precision to money

Converteren naar tekst

Hier is een voorbeeld van het gebruik van to_char() om de waarde om te zetten in tekst met het valutasymbool erbij.

SELECT to_char(12, 'L99D99');

Resultaat:

$ 12.00

Hier gebruiken zowel het valutasymbool als de decimale plaats de huidige landinstelling.

De opmaakreeks voor to_char() moet passen bij het verwachte bedrag.

Als het bedrag bijvoorbeeld in de honderdduizenden zou kunnen lopen, dan zou de volgende opmaakreeks geschikter zijn.

SELECT to_char(123456.78, 'L999G999D99');

Resultaat:

$ 123,456.78

In dit geval heb ik de G . toegevoegd sjabloonpatroon voor een lokaal-bewust groepsscheidingsteken (ook wel een 'duizenden-scheidingsteken' genoemd). Ik had een komma kunnen gebruiken (, ), maar dat zou niet locale-aware zijn geweest.

En ik heb opnieuw de D . toegevoegd sjabloonpatroon voor een locale-aware decimale punt.

Dit is wat er gebeurt als ik die twee sjabloonpatronen uit mijn opmaakreeks verwijder.

SELECT to_char(123456.78, 'L999999');

Resultaat:

$ 123457

Onbeduidende nullen

U kunt 0 . gebruiken in plaats van 9 om onbeduidende nullen te behouden.

De 9 sjabloonpatroon laat alle onbeduidende nullen vallen terwijl de 0 sjabloonpatroon niet.

Hier is een voorbeeld dat het verschil tussen de twee illustreert.

SELECT 
  to_char(12, 'L9999') AS "L9999",
  to_char(12, 'L0000') AS "L0000";

Resultaat:

 L9999  | L0000  
--------+--------
 $   12 | $ 0012

Vulmodus

Er is een handige sjabloonpatroonmodifier genaamd FM . Dit is voor de "vulmodus" en onderdrukt nullen en voorloopspaties.

We kunnen die modifier daarom gebruiken om het vorige voorbeeld aan te passen.

SELECT 
  to_char(12, 'LFM9999') AS "LFM9999",
  to_char(12, 'LFM0000') AS "LFM0000";

Resultaat:

 LFM9999 | LFM0000 
---------+---------
 $12     | $0012

Merk op dat het de eerste spaties tussen het dollarteken en het getal onderdrukte.


  1. Verbroken UTF-8-codering repareren

  2. SQL-fout ORA-01722:ongeldig nummer

  3. Hoe repareer ik een InnoDB-tabel?

  4. Zijn query's van het SELECT-type het enige type dat kan worden genest?