For at formatere et tal som valuta i Postgres kan du enten konvertere det til pengedatatypen eller bruge to_char()
for at konvertere det til tekst, der indeholder det relevante valutasymbol.
Dette forudsætter naturligvis, at nummeret ikke allerede er gemt ved hjælp af pengetypen.
Nedenfor er eksempler på hver af disse muligheder.
Konverter til penge
Her er et eksempel på konvertering af et tal til pengedatatypen.
SELECT cast(12 as money);
Resultat:
$12.00
Her er endnu et eksempel, denne gang med et større beløb.
SELECT cast(123456.78 as money);
Resultat:
$123,456.78
Konverter fra et flydende kommatal
Det frarådes at bruge flydende kommatal til at håndtere penge på grund af muligheden for afrundingsfejl. Men hvis du skal gøre det, kan du først konvertere til numerisk og derefter til penge.
SELECT '123456.78'::float8::numeric::money;
Resultat:
$123,456.78
Hvis du forsøger at konvertere direkte fra floating point til penge, får du en fejl.
SELECT '123456.78'::float8::money;
Resultat:
ERROR: cannot cast type double precision to money
Konverter til tekst
Her er et eksempel på brug af to_char()
at konvertere værdien til tekst med valutasymbolet inkluderet.
SELECT to_char(12, 'L99D99');
Resultat:
$ 12.00
Her bruger både valutasymbolet og decimalen den aktuelle lokalitet.
Formatstrengen for to_char()
skal passe til det forventede beløb.
For eksempel, hvis beløbet kunne gå op i hundredtusindvis, ville følgende formatstreng være mere passende.
SELECT to_char(123456.78, 'L999G999D99');
Resultat:
$123,456.78
I dette tilfælde tilføjede jeg G
skabelonmønster for en lokalitetsbevidst gruppeseparator (også kaldet en "tusinderseparator"). Jeg kunne have brugt et komma (,
), men det ville ikke have været lokalitetsbevidst.
Og jeg tilføjede igen D
skabelonmønster for et lokalitetsbevidst decimaltegn.
Her er, hvad der sker, hvis jeg fjerner de to skabelonmønstre fra min formatstreng.
SELECT to_char(123456.78, 'L999999');
Resultat:
$ 123457
Ubetydelige nuller
Du kan bruge 0
i stedet for 9
at beholde ubetydelige nuller.
9
skabelonmønsteret taber alle ubetydelige nuller, mens 0
skabelonmønster gør det ikke.
Her er et eksempel, der illustrerer forskellen mellem de to.
SELECT
to_char(12, 'L9999') AS "L9999",
to_char(12, 'L0000') AS "L0000";
Resultat:
L9999 | L0000 --------+-------- $ 12 | $ 0012
Fyldtilstand
Der er en praktisk skabelonmønstermodifikator kaldet FM
. Dette er til "udfyldningstilstand", og det undertrykker efterfølgende nuller og førende blanktegn.
Vi kan derfor bruge denne modifikator til at ændre det foregående eksempel.
SELECT
to_char(12, 'LFM9999') AS "LFM9999",
to_char(12, 'LFM0000') AS "LFM0000";
Resultat:
LFM9999 | LFM0000 ---------+--------- $12 | $0012
Bemærk, at det undertrykte de førende tomme felter mellem dollartegnet og tallet.