firebird’de sayıları yazıya çeviren procedure

Bir zamanlar yazmış olduğum, firebird veritabanı üzerinde sayıları yazıya çeviren procedure.

Kullanım:
SELECT p.TUTARYAZI FROM YAZIYLA(111023.03) p
TUTARYAZI
---------
YÜZONBİRBİNYİRMİÜÇ YTL ÜÇ YKR

Kaynak kodları…

SET TERM ^ ;

CREATE PROCEDURE BASAMAKYAZI( BASAMAK Integer, RAKAM Integer )
RETURNS ( YAZI Varchar(20) ) 
AS
BEGIN
    YAZI= 
    case basamak
    when 1 then
        case rakam
            when 1 then 'BİR'
            when 2 then 'İKİ'
            when 3 then 'ÜÇ'
            when 4 then 'DÖRT'
            when 5 then 'BEŞ'
            when 6 then 'ALTI'
            when 7 then 'YEDİ'
            when 8 then 'SEKİZ'
            when 9 then 'DOKUZ'
        end
    when 2 then
        case rakam
            when 1 then 'ON'
            when 2 then 'YİRMİ'
            when 3 then 'OTUZ'
            when 4 then 'KIRK'
            when 5 then 'ELLİ'
            when 6 then 'ALTMIŞ'
            when 7 then 'YETMİŞ'
            when 8 then 'SEKSEN'
            when 9 then 'DOKSAN'
        end
    when 3 then
        case rakam
        when 1 then 'YÜZ'
        when 2 then 'İKİYÜZ'
        when 3 then 'ÜÇYÜZ'
        when 4 then 'DÖRTYÜZ'
        when 5 then 'BEŞYÜZ'
        when 6 then 'ALTIYÜZ'
        when 7 then 'YEDİYÜZ'
        when 8 then 'SEKİZYÜZ'
        when 9 then 'DOKUZYÜZ'
    end
end;
SUSPEND;
END^
SET TERM ; ^

SET TERM ^ ;
CREATE PROCEDURE YAZIYLA ( TUTAR Numeric(18,2) )
RETURNS ( TUTARYAZI Varchar(300) )
AS
DECLARE VARIABLE tutarstr VARCHAR(50);
DECLARE VARIABLE yazi VARCHAR(50);
DECLARE VARIABLE len integer;
DECLARE VARIABLE tamsayistr VARCHAR(50);
DECLARE VARIABLE tamsayiuz integer;
DECLARE VARIABLE kesirstr VARCHAR(2);
DECLARE VARIABLE i integer;
DECLARE VARIABLE rakam integer;
DECLARE VARIABLE basamak integer;
DECLARE VARIABLE uclubasamak integer;
BEGIN

    tutarstr=tutar;
    len = 0;
    TUTARYAZI = '';
    len= CHAR_LENGTH(tutarstr);

    IF (len = 0) THEN
    BEGIN
        TUTARYAZI = 'SIFIR';
    END
    
    tamsayiuz = len-3;
    tamsayistr = SUBSTRING(tutarstr FROM 1 FOR tamsayiuz);
    kesirstr = SUBSTRING(tutarstr FROM len-1 FOR 2);

    i = 1;
    uclubasamak = tamsayiuz;
    WHILE (uclubasamak>3) DO BEGIN
        uclubasamak = uclubasamak-3;
    END

    -- Tam kısmı
    WHILE (i<=tamsayiuz) DO
    BEGIN
        rakam = SUBSTRING(tamsayistr FROM i FOR 1);
        basamak = tamsayiuz-i+1;
    
        IF ((tamsayiuz=1) AND rakam=0) THEN TUTARYAZI = 'SIFIR';

        IF (( rakam>0 ) and (not ( tamsayiuz = 4 and basamak = 4 and rakam = 1 ))) THEN
        BEGIN
            -- 1111 
            EXECUTE PROCEDURE BASAMAKYAZI(:uclubasamak,:rakam) RETURNING_VALUES :YAZI;
            TUTARYAZI = TUTARYAZI || TRIM(YAZI);
        END

        IF ((BASAMAK=4) AND (TUTARYAZI not like '%MİLYON' and TUTARYAZI not like '%MİLYAR')) THEN TUTARYAZI = TUTARYAZI||'BİN' ;
        IF ((BASAMAK=7) AND ( TUTARYAZI not like '%MİLYAR' )) THEN TUTARYAZI = TUTARYAZI || 'MİLYON';
        IF (BASAMAK=10) THEN TUTARYAZI = TUTARYAZI || 'MİLYAR';

        i = i + 1;
        uclubasamak = uclubasamak - 1;
        IF (uclubasamak = 0) THEN uclubasamak = 3;
    END
    
    TUTARYAZI = TUTARYAZI||' TL ';

    -- Kuruş Kısmı
    IF (CAST (kesirstr AS INTEGER)>0) THEN
    BEGIN
        rakam = SUBSTRING(kesirstr FROM 1 FOR 1);
        IF ( rakam > 0 ) THEN
        BEGIN
            EXECUTE PROCEDURE BASAMAKYAZI(2,:rakam) RETURNING_VALUES :YAZI;
            TUTARYAZI= TUTARYAZI||TRIM(YAZI);
        END

        rakam = SUBSTRING(kesirstr FROM 2 FOR 1);
        IF ( rakam > 0 ) THEN
        BEGIN
            EXECUTE PROCEDURE BASAMAKYAZI(1,:rakam) RETURNING_VALUES :YAZI;
            TUTARYAZI= TUTARYAZI||TRIM(YAZI);
        END
        TUTARYAZI= TUTARYAZI||' KR';
    END

SUSPEND;
END^
SET TERM ; ^

3 thoughts on “firebird’de sayıları yazıya çeviren procedure”

  1. Bu güzel çalışma için teşekkür ederim. Kendi projemde kullanıyorum. Bir sorunla karşılaşıyorum. 3000 TL için sonuç BİNTL şeklinde geriye dönüyor. Nasıl düzeltebilirim.

    1. Kod üzerinde değişiklik yaptım.
      Kodu tekrar alıp çalıştırınız.

      İyi çalışmalar.

Leave a Reply

Your email address will not be published. Required fields are marked *