in Eski Blog Yazılarım

T-SQL’de Rakam’ı yazıya çevirmek.

MsSql Server da UDF olarak çalışan bu script rakam olarak aldığı parametreleri size yazı ile geri döndürüyor.

Eralper, Sağ olsun eski scriptteki hatayı farkedince yeni bir script yazmış. Onun yazdığı daha sağlıklı çalıştığından script’i güncelledim.

create function udf_sayiyi_yaziya_cevirme(
 @sayi bigint,
 @buyukharf bit
)
returns nvarchar(max)
-- developed by Eralper (http://www.kodyaz.com)
begin

declare @yaziilesayi nvarchar(max)
set @yaziilesayi = N''

declare @sayivarchar varchar(100)
set @sayivarchar = cast(@sayi as varchar(100))

declare @toplambasamak smallint
set @toplambasamak = len(@sayivarchar)

declare @basamak smallint
declare @rakam tinyint

declare @i smallint
set @i = 0

while @i < @toplambasamak
begin
 set @basamak = @toplambasamak - @i
 set @i = @i + 1
-- sıra ile soldan başlayarak rakamları oku
 set @rakam = substring(@sayivarchar, @i, 1)

 select
  @yaziilesayi = @yaziilesayi +
-- rakamın basamak değeri gözönüne alınarak metin oluşturuluyor
  case @rakam
  when 0 then N''
  when 1 then
   case @basamak % 3 when 0 then N'yüz' when 2 then N'on' when 1 then
    case when @toplambasamak = 4 and @i = 1 then N'' else
     case when @i = @toplambasamak then N'bir' else
      case when substring(@sayivarchar, @i-2, 2) = '00'
       then N'' else N'bir'
      end
     end
    end
   end
  when 2 then
   case @basamak % 3
    when 0 then N'iki yüz' when 2 then N'yirmi' when 1 then N'iki' end
  when 3 then
   case @basamak % 3
    when 0 then N'üç yüz' when 2 then N'otuz' when 1 then N'üç' end
  when 4 then
   case @basamak % 3
    when 0 then N'dört yüz' when 2 then N'kırk' when 1 then N'dört' end
  when 5 then
   case @basamak % 3
    when 0 then N'beş yüz' when 2 then N'elli' when 1 then N'beş' end
  when 6 then
   case @basamak % 3
    when 0 then N'altı yüz' when 2 then N'altmış' when 1 then N'altı' end
  when 7 then
   case @basamak % 3
    when 0 then N'yedi yüz' when 2 then N'yetmiş' when 1 then N'yedi' end
  when 8 then
   case @basamak % 3
    when 0 then N'sekiz yüz' when 2 then N'seksen' when 1 then N'sekiz' end
  when 9 then
   case @basamak % 3
    when 0 then N'dokuz yüz' when 2 then N'doksan' when 1 then N'dokuz' end
  end + space(1) +
  case @basamak
   when 4 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'bin' end
   when 7 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'milyon' end
   when 10 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'milyar' end
   when 13 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'trilyon' end
   when 16 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'katrilyon' end
   else N''
  end + space(1)
end

-- Çevrim sırasında oluşabilecek fazla SPACE karakterleri temizleniyor
set @yaziilesayi = ltrim(rtrim(@yaziilesayi))

WHILE REPLACE(@yaziilesayi, space(2), space(1)) <> @yaziilesayi
BEGIN
 SELECT @yaziilesayi = REPLACE(@yaziilesayi, space(2), space(1))
END

-- Metin büyük harflerle isteniyorsa UPPER fonksiyonu kullanılıyor
if @buyukharf = 1
 set @yaziilesayi = UPPER(@yaziilesayi collate turkish_ci_as)

-- sayının yazı ile ifadesini içeren değişken döndürülüyor
return @yaziilesayi

end

Leave a Reply for Dogan Cancel Reply

Yorum Bırak

Comment

  1. Merhaba Oğuz,
    Benim de benzer bir fonksiyona ihtiyacım oldu, fonksiyonun için teşekkürler ama 1010 gibi bir sayıyı düzgün bir şekilde metne dönüştürmediğini farkettim.
    Ben de kendim bir tane fonksiyon yazdım. Hem onu paylaşmak ( udf_sayiyi_yaziya_cevirme) hem de kendi fonksiyonunda güncelleme yapman için bilgi vermek istedim.

  2. Kardeşim Sana Teşekkür ederim . Senin Koduna küçük eklentiler ve yeni bir fonksiyonda ekledim. Umarım Insanlar istifade ederler…

    /****** Object: UserDefinedFunction [fn_yaziya_cevir] Script Date: 11/17/2015 17:47:55 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    Create function [fn_yaziya_cevir](
    @sayi bigint,
    @buyukharf bit
    )
    returns varchar(500)
    — developed by Eralper (http://www.kodyaz.com)
    begin

    declare @yaziilesayi nvarchar(max)
    set @yaziilesayi = N”

    declare @sayivarchar varchar(100)
    set @sayivarchar = cast(@sayi as varchar(100))

    declare @toplambasamak smallint
    set @toplambasamak = len(@sayivarchar)

    declare @basamak smallint
    declare @rakam tinyint

    declare @i smallint
    set @i = 0

    while @i < @toplambasamak
    begin
    set @basamak = @toplambasamak – @i
    set @i = @i + 1
    — sıra ile soldan başlayarak rakamları oku
    set @rakam = substring(@sayivarchar, @i, 1)

    select
    @yaziilesayi = @yaziilesayi +
    — rakamın basamak değeri gözönüne alınarak metin oluşturuluyor
    case @rakam
    when 0 then N''
    when 1 then
    case @basamak % 3 when 0 then N'Yüz' when 2 then N'On' when 1 then
    case when @toplambasamak = 4 and @i = 1 then N'' else
    case when @i = @toplambasamak then N'Bir' else
    case when substring(@sayivarchar, @i-2, 2) = '00'
    then N'' else N'Bir'
    end
    end
    end
    end
    when 2 then
    case @basamak % 3
    when 0 then N'İkiYüz' when 2 then N'Yirmi' when 1 then N'İki' end
    when 3 then
    case @basamak % 3
    when 0 then N'ÜçYüz' when 2 then N'Otuz' when 1 then N'Üç' end
    when 4 then
    case @basamak % 3
    when 0 then N'DörtYüz' when 2 then N'Kırk' when 1 then N'Dört' end
    when 5 then
    case @basamak % 3
    when 0 then N'BeşYüz' when 2 then N'Elli' when 1 then N'Beş' end
    when 6 then
    case @basamak % 3
    when 0 then N'AltıYüz' when 2 then N'Altmış' when 1 then N'Altı' end
    when 7 then
    case @basamak % 3
    when 0 then N'YediYüz' when 2 then N'Yetmiş' when 1 then N'Yedi' end
    when 8 then
    case @basamak % 3
    when 0 then N'SekizYüz' when 2 then N'Seksen' when 1 then N'Sekiz' end
    when 9 then
    case @basamak % 3
    when 0 then N'DokuzYüz' when 2 then N'Doksan' when 1 then N'Dokuz' end
    end + space(1) +
    case @basamak
    when 4 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'Bin' end
    when 7 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'Milyon' end
    when 10 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'Milyar' end
    when 13 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'Trilyon' end
    when 16 then
    case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'Katrilyon' end
    else N''
    end + space(1)
    end

    — Çevrim sırasında oluşabilecek fazla SPACE karakterleri temizleniyor
    set @yaziilesayi = ltrim(rtrim(@yaziilesayi))

    –WHILE REPLACE(@yaziilesayi, space(2), space(1)) @yaziilesayi
    –BEGIN
    — SELECT @yaziilesayi = REPLACE(@yaziilesayi, space(2), space(1))
    –END

    SET @yaziilesayi = REPLACE(@yaziilesayi, space(1), ”)

    — Metin büyük harflerle isteniyorsa UPPER fonksiyonu kullanılıyor
    if @buyukharf = 1
    set @yaziilesayi = UPPER(@yaziilesayi collate turkish_ci_as)

    — sayının yazı ile ifadesini içeren değişken döndürülüyor
    return @yaziilesayi

    end
    GO

    –***************

    /****** Object: UserDefinedFunction [fn_yaziyla] Script Date: 11/17/2015 17:48:48 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    — =============================================
    — Author:
    — Create date:
    — Description:
    — =============================================
    CREATE FUNCTION [fn_yaziyla]
    (

    @Rakam MONEY,
    @buyukharf bit
    )
    RETURNS Varchar(200)
    AS
    BEGIN

    DECLARE @TL AS Varchar(200)
    DECLARE @Kurus AS Varchar(200)
    declare @sRakam VARCHAR(200)
    DECLARE @Nokta int

    SELECT @sRakam= convert(varchar(200), @Rakam ,2)
    SET @Nokta = PATINDEX(‘%.%’,@sRakam)

    SET @TL=LEFT(@sRakam, @Nokta-1)
    SET @Kurus=LEFT(RIGHT(@sRakam,LEN(@sRakam)- @Nokta),2)

    SET @TL = dbo.fn_yaziya_cevir( Convert(bigint,@TL ) ,@buyukharf )
    SET @Kurus= dbo.fn_yaziya_cevir( Convert(bigint,@Kurus) ,@buyukharf)

    RETURN
    (
    RTRIM( LTRIM( CASE WHEN @TL” THEN @TL + ‘ TL ‘ ELSE ” END + CASE WHEN @Kurus” THEN @Kurus + ‘ Kurus’ ELSE ” END ) )

    )

    END

    GO