Çoğu faturaların, çeklerin, senetlerin vb tutarlarının yanında yazı ile yaılmaları gerekmektedir. Son günlerde duyduğum bir ihtiyaçtan dolayı bu çeviri işlemini MySQL veritabanı üzerinde sorgu esnasında yapmak durumunda kaldım. Şimdi bu kodu sizlerle paylaşıyorum:

MYSQL

CREATE DEFINER = 'adminuser'@'%' FUNCTION `number_to_string`(
    n DOUBLE(15,2)
)

RETURNS varchar(100) CHARSET latin5
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
    COMMENT ''

BEGIN

DECLARE ans varchar(2000);
DECLARE dig1, dig2, dig3 VARCHAR(20); 
DECLARE uclukler, ucluklerTers int;
DECLARE tam, ondalik CHAR(30);
DECLARE strNum CHAR(3);
DECLARE strNumKalan CHAR(30);
DECLARE ind int;

SET uclukler = 0;
SET ucluklerTers = 0;
SET ans = '';
SET strNumKalan = '';

-- Tam Ondalık kısmı alır
SET strNumKalan = CAST(n AS CHAR(30));
SET strNumKalan = REPLACE(strNumKalan, ',', '.');
SET ondalik = SUBSTRING_INDEX(strNumKalan,'.',-1);
SET tam = SUBSTRING_INDEX(strNumKalan,'.',1);

-- Tam kısımda kaçtane 3 lü parça var
WHILE FLOOR(tam/ POW(1000, uclukler)) > 0 DO
    SET uclukler = uclukler +1;
END WHILE;

SET strNumKalan = tam;

-- Tam kısım parçalanması
WHILE (uclukler > 0) DO
    -- Kelimelere dokulcek kısmı ayır
    IF(ucluklerTers = 0) THEN
        Set ind = LENGTH(strNumKalan)%3;
        IF(ind = 0) THEN
            SET ind = 3;
        END IF;
        SET strNum = SUBSTRING(strNumKalan, 1, ind);
        SET strNumKalan = CONCAT('', SUBSTRING(strNumKalan, LENGTH(strNum)%3 +1));
    ELSE
        SET strNum = SUBSTRING(strNumKalan, 1, 3);
        SET strNumKalan = CONCAT('', SUBSTRING(strNumKalan, 4));
    END IF;

    SET uclukler = uclukler -1;
    SET ucluklerTers = ucluklerTers +1;

    -- 100luk 10luk 1lik kısımları al
    IF (LENGTH(strNum) = 3) THEN
        SET dig3 = SUBSTRING(strNum, 1, 1);
        SET dig2 = SUBSTRING(strNum, 2, 1);
        SET dig1 = SUBSTRING(strNum, 3, 1);
    ELSEIF(LENGTH(strNum) = 2) then
        SET dig3 = '0';
        SET dig2 = SUBSTRING(strNum, 1, 1);
        SET dig1 = SUBSTRING(strNum, 2, 1); 
    ELSE
        SET dig3 = '0';
        SET dig2 = '0';
        SET dig1 = SUBSTRING(strNum, 1, 1);
    END IF;

    -- Cümleye dök
    IF NOT(dig3 = '0' AND dig2 = '0' AND dig1 = '1' AND uclukler = 1) THEN
        IF dig3 <> '0' THEN
            CASE
                WHEN dig3='1' THEN SET ans=CONCAT(ans, 'Yüz');
                WHEN dig3='2' THEN SET ans=CONCAT(ans, 'İkiyüz');
                WHEN dig3='3' THEN SET ans=CONCAT(ans, 'Üçyüz');
                WHEN dig3='4' THEN SET ans=CONCAT(ans, 'Dörtyüz');
                WHEN dig3='5' THEN SET ans=CONCAT(ans, 'Beşyüz');
                WHEN dig3='6' THEN SET ans=CONCAT(ans, 'Altıyüz');
                WHEN dig3='7' THEN SET ans=CONCAT(ans, 'Yediyüz');
                WHEN dig3='8' THEN SET ans=CONCAT(ans, 'Sekizyüz');
                WHEN dig3='9' THEN SET ans=CONCAT(ans, 'Dokuzyüz');
                ELSE SET ans = ans;
            END CASE;
        END IF; 

        IF dig2 <> '0' THEN
            CASE
                WHEN dig2='1' THEN SET ans=CONCAT(ans, 'On');
                WHEN dig2='2' THEN SET ans=CONCAT(ans, 'Yirmi');
                WHEN dig2='3' THEN SET ans=CONCAT(ans, 'Otuz');
                WHEN dig2='4' THEN SET ans=CONCAT(ans, 'Kırk');
                WHEN dig2='5' THEN SET ans=CONCAT(ans, 'Elli');
                WHEN dig2='6' THEN SET ans=CONCAT(ans, 'Altmış');
                WHEN dig2='7' THEN SET ans=CONCAT(ans, 'Yetmiş');
                WHEN dig2='8' THEN SET ans=CONCAT(ans, 'seksen');
                WHEN dig2='9' THEN SET ans=CONCAT(ans, 'Doksan');
                ELSE SET ans=ans;
            END CASE;
        END IF;
      
        IF dig1 <> '0' THEN
            CASE
                WHEN dig1='1' THEN SET ans=CONCAT(ans, 'Bir');
                WHEN dig1='2' THEN SET ans=CONCAT(ans, 'İki');
                WHEN dig1='3' THEN SET ans=CONCAT(ans, 'Üç');
                WHEN dig1='4' THEN SET ans=CONCAT(ans, 'Dört');
                WHEN dig1='5' THEN SET ans=CONCAT(ans, 'Beş');
                WHEN dig1='6' THEN SET ans=CONCAT(ans, 'Altı');
                WHEN dig1='7' THEN SET ans=CONCAT(ans, 'Yedi');
                WHEN dig1='8' THEN SET ans=CONCAT(ans, 'Sekiz');
                WHEN dig1='9' THEN SET ans=CONCAT(ans, 'Dokuz');
                ELSE SET ans=ans;
            END CASE;
        END IF;
   END IF;
  
    IF(dig3 <> '0' OR dig2 <> '0' OR dig1 <> '0' ) THEN
        CASE
            WHEN uclukler = 2 THEN SET ans=CONCAT(ans, 'Milyon');
            WHEN uclukler = 1 THEN SET ans=CONCAT(ans, 'Bin');
            ELSE SET ans=ans;
        END CASE;
    END IF;
END WHILE;

IF(ans<>'') THEN
    SET ans=CONCAT(ans, 'Lira');
END IF;

-- Kurus kısmı
IF(LENGTH(ondalik) = 1) THEN
    SET dig2 = '0';
    SET dig1 = SUBSTRING(ondalik, 1, 1);
ELSE
    SET dig2 = SUBSTRING(ondalik, 1, 1);
    SET dig1 = SUBSTRING(ondalik, 2, 1);
END IF;

IF dig2 <> '0' THEN
    CASE
        WHEN dig2='1' THEN SET ans=CONCAT(ans, 'On');
        WHEN dig2='2' THEN SET ans=CONCAT(ans, 'Yirmi');
        WHEN dig2='3' THEN SET ans=CONCAT(ans, 'Otuz');
        WHEN dig2='4' THEN SET ans=CONCAT(ans, 'Kırk');
        WHEN dig2='5' THEN SET ans=CONCAT(ans, 'Elli');
        WHEN dig2='6' THEN SET ans=CONCAT(ans, 'Altmış');
        WHEN dig2='7' THEN SET ans=CONCAT(ans, 'Yetmiş');
        WHEN dig2='8' THEN SET ans=CONCAT(ans, 'Seksen');
        WHEN dig2='9' THEN SET ans=CONCAT(ans, 'Doksan');
        ELSE SET ans=ans;
    END CASE;
END IF;

IF dig1 <> '0' THENn
    CASE
        WHEN dig1='1' THEN SET ans=CONCAT(ans, 'Bir');
        WHEN dig1='2' THEN SET ans=CONCAT(ans, 'İki');
        WHEN dig1='3' THEN SET ans=CONCAT(ans, 'Üç');
        WHEN dig1='4' THEN SET ans=CONCAT(ans, 'Dört');
        WHEN dig1='5' THEN SET ans=CONCAT(ans, 'Beş');
        WHEN dig1='6' THEN SET ans=CONCAT(ans, 'Altı');
        WHEN dig1='7' THEN SET ans=CONCAT(ans, 'Yedi');
        WHEN dig1='8' THEN SET ans=CONCAT(ans, 'Sekiz');
        WHEN dig1='9' THEN SET ans=CONCAT(ans, 'Dokuz');
        ELSE SET ans=ans;
   END CASE;
END IF;

IF(dig2 <> '0' OR dig1 <> '0' ) THEN
    SET ans=CONCAT(ans, 'Kurus');
END IF;

RETURN TRIM(ans);

END;

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=UTF-8" http-equiv="content-type">
  <title></title>
  <script type="text/javascript">
  function cevir(){
     var el=document.getElementById('inp1');
     var el2=document.getElementById('inp2');
     if(el.value.length==1 && el.value==0) return el2.value="sıfır";
     var basamak=[
        [0,"","","","bin",""],
        [1,"bir","on","yüz","bin","on"],
        [2,"iki","yirmi","iki yüz","iki bin","yirmi"],
        [3,"üç","otuz","üç yüz","üç bin","otuz"],
        [4,"dört","kırk","dört yüz","dört bin","kırk"],
        [5,"beş","elli","beş yüz","beş bin","elli"],
        [6,"altı","altmış","altı yüz","altı bin","altmış"],
        [7,"yedi","yetmiş","yedi yüz","yedi bin","yetmiş"],
        [8,"sekiz","seksen","sekiz yüz","sekiz bin","seksen"],
        [9,"dokuz","doksan","dokuz yüz","dokuz bin","doksan"]
    ];

    var arr=[];
    for(var n=0, b=el.value.length; n<el.value.length; n++,b--) {
      for(var i=0; i<10; i++) {
        if(el.value.charAt(n)==basamak[i][0]) arr[arr.length]=basamak[i][b];
      }
    }
    el2.value=arr.join(" ");
  }
</script>
</head>
<body>
   <input type="text" id="inp1" value="">
   <input type="button"  value="yazıya çevir" onclick="cevir()" >
    <input type="text" id="inp2" >
</body>
</html>

(Kaynak: http://forum.ceviz.net/javascript-dhtml-ajax/57534-sayiyi-yaziya-cevirme.html)

ORACLE

CREATE OR REPLACE FUNCTION spell_number (p_number IN NUMBER)
   RETURN VARCHAR2
AS
   TYPE myArray IS TABLE OF VARCHAR2 (255);
 
   l_str myArray
         := myArray ('',
                     ' thousand ',
                     ' million ',
                     ' billion ',
                     ' trillion ',
                     ' quadrillion ',
                     ' quintillion ',
                     ' sextillion ',
                     ' septillion ',
                     ' octillion ',
                     ' nonillion ',
                     ' decillion ',
                     ' undecillion ',
                     ' duodecillion ');
 
   l_num      VARCHAR2 (50) DEFAULT TRUNC (p_number);
   l_return   VARCHAR2 (4000);
BEGIN
   FOR i IN 1 .. l_str.COUNT
   LOOP
      EXIT WHEN l_num IS NULL;
 
      IF (SUBSTR (l_num, LENGTH (l_num) - 2, 3) <> 0)
      THEN
         l_return :=
            TO_CHAR (TO_DATE (SUBSTR (l_num, LENGTH (l_num) - 2, 3), 'J'),
                     'Jsp')
            || l_str (i)
            || l_return;
      END IF;
 
      l_num := SUBSTR (l_num, 1, LENGTH (l_num) - 3);
   END LOOP;
 
   RETURN l_return;
END;
/
 
 
SELECT spell_number (53734555555585) FROM DUAL;

(Kaynak: http://viralpatel.net/blogs/convert-number-into-words-oracle-sql-query/)

Tags: , | Categories: SQL | HTML | Javascript | Oracle