För att formatera ett tal som valuta i Postgres kan du antingen konvertera det till pengadatatypen eller använda to_char()
för att konvertera den till text som innehåller lämplig valutasymbol.
Detta förutsätter uppenbarligen att numret inte redan är lagrat med pengatypen.
Nedan finns exempel på vart och ett av dessa alternativ.
Konvertera till pengar
Här är ett exempel på att konvertera ett nummer till pengadatatypen.
SELECT cast(12 as money);
Resultat:
$12.00
Här är ett annat exempel, den här gången med en större mängd.
SELECT cast(123456.78 as money);
Resultat:
$123,456.78
Konvertera från ett flyttal
Det rekommenderas att inte använda flyttal för att hantera pengar på grund av risken för avrundningsfel. Men om du måste göra det kan du först konvertera till numeriska och sedan till pengar.
SELECT '123456.78'::float8::numeric::money;
Resultat:
$123,456.78
Om du försöker konvertera direkt från flyttal till pengar får du ett felmeddelande.
SELECT '123456.78'::float8::money;
Resultat:
ERROR: cannot cast type double precision to money
Konvertera till text
Här är ett exempel på hur du använder to_char()
för att konvertera värdet till text med valutasymbolen inkluderad.
SELECT to_char(12, 'L99D99');
Resultat:
$12.00
Här använder både valutasymbolen och decimalen det aktuella språket.
Formatsträngen för to_char()
måste vara lämplig för det förväntade beloppet.
Om beloppet till exempel skulle kunna hamna i hundratusentals, skulle följande formatsträng vara mer lämplig.
SELECT to_char(123456.78, 'L999G999D99');
Resultat:
$123,456.78
I det här fallet lade jag till G
mallmönster för en platsmedveten gruppseparator (även kallad en "tusentalsavgränsare"). Jag kunde ha använt ett kommatecken (,
), men det skulle inte ha varit lokalt medvetet.
Och jag lade till D
igen mallmönster för en platsmedveten decimalkomma.
Det här är vad som händer om jag tar bort dessa två mallmönster från min formatsträng.
SELECT to_char(123456.78, 'L999999');
Resultat:
$ 123457
Oväsentliga nollor
Du kan använda 0
istället för 9
att behålla obetydliga nollor.
9
mallmönster tappar alla obetydliga nollor medan 0
mallmönster gör det inte.
Här är ett exempel som illustrerar skillnaden mellan de två.
SELECT
to_char(12, 'L9999') AS "L9999",
to_char(12, 'L0000') AS "L0000";
Resultat:
L9999 | L0000 --------+-------- $ 12 | $ 0012
Fyllningsläge
Det finns en praktisk mallmönstermodifierare som heter FM
. Detta är för "fyllningsläge", och det undertrycker efterföljande nollor och inledande blanksteg.
Vi kan därför använda den modifieraren för att modifiera föregående exempel.
SELECT
to_char(12, 'LFM9999') AS "LFM9999",
to_char(12, 'LFM0000') AS "LFM0000";
Resultat:
LFM9999 | LFM0000 ---------+--------- $12 | $0012
Lägg märke till att den undertryckte de inledande blanktecken mellan dollartecknet och siffran.