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