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
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.
Teşekkürler Eralper,
Güncellemeleri yaptım ;)
Teşekkürler, elinize sağlık
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