金额转换pgsql存储过程

CREATE OR REPLACE FUNCTION number_to_english(n NUMERIC)
RETURNS TEXT AS $$
DECLARE
ones ARRAY[13] := ARRAY['', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve'];
tens ARRAY[10] := ARRAY['', 'Ten', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];
teens ARRAY[10] := ARRAY['Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];
result TEXT;
integer_part INT;
decimal_part INT;
decimal_str TEXT;
BEGIN
IF n < 0 THEN
result := 'Minus ';
n := -n;
ELSE
result := '';
END IF;

integer_part := FLOOR(n);
decimal_part := (n - integer_part) * 100;
decimal_str := TO_CHAR(decimal_part, 'FM00');

IF integer_part < 13 THEN
result := result || ones[integer_part];
ELSIF integer_part < 20 THEN
result := result || teens[integer_part - 10];
ELSIF integer_part < 100 THEN
result := result || tens[integer_part / 10] || ' ' || ones[integer_part % 10];
ELSIF integer_part < 1000 THEN
result := result || ones[integer_part / 100] || ' Hundred' || (CASE WHEN integer_part % 100 = 0 THEN '' ELSE ' ' END) || number_to_english(integer_part % 100);
ELSIF integer_part < 1000000 THEN
result := result || number_to_english(integer_part / 1000) || ' Thousand' || (CASE WHEN integer_part % 1000 = 0 THEN '' ELSE ' ' END) || number_to_english(integer_part % 1000);
ELSE
result := result || number_to_english(integer_part / 1000000) || ' Million' || (CASE WHEN integer_part % 1000000 = 0 THEN '' ELSE ' ' END) || number_to_english(integer_part % 1000000);
END IF;

IF decimal_part > 0 THEN
result := result || ' Point ' || number_to_english(decimal_part);
END IF;

RETURN result;
END;
$$ LANGUAGE plpgsql;

posted @ 2024-02-04 13:49  crazy_script  阅读(34)  评论(0)    收藏  举报