SQL Server administration and T-SQL development, Web Programming with ASP.NET, HTML5 and Javascript, Windows Phone 8 app development, SAP Smartforms and ABAP Programming, Windows 7, Visual Studio and MS Office software Kodyaz SQL Server and T-SQL Development Tutorials
Development resources, articles, tutorials, samples, codes and tools for .Net, SQL Server, Windows, Windows Phone, SAP and ABAP, like SAP UI5, Screen Personas, etc.




download SQL Server 2016
download SQL Server 2014
download SQL Server 2012



Sayıyı Yazıya çeviren SQL fonksiyonu

This SQL tutorial is in Turkish and provides a SQL function to convert numbers into words in Turkish.

Sayıyı yazıya çeviren SQL fonksiyonları, SQL Server üzerinde geliştirme yapan her SQL programcısının zaman zaman ihtiyaç duyacağı fonksiyonlardır.
Verilen bir sayıyı veya sayıları, bir rakamı yazıya çeviren fonksiyon ihtiyacı sadece SQL Server üzerinde SQL geliştiricileri için değil, değişik platformlarda geliştirme yapan her programcının bir gün karşısına çıkacak bir ihtiyaçtır.
SQL Server saklı yordamınızda (stored procedure) veya ASP.NET uygulamanızda C-Sharp veya VB.NET kodunuzda kullanmak isteyeceğiniz, hatta JavaScript veya SAP uygulamanızda ABAP kodunuz içinde bile sayıyı yazıya veya metine çevirecek fonksiyonları elinizin altında bulundurmanızı tavsiye ederim.

Türkçe bir uygulama üzerinde çalışıyorsanız, Internette "number to words" benzeri aramalarla bulabileceğiniz örnek fonksiyonlar işinize yaramayacaktır. Çünkü her dilin sayıları metin yoluyla ifade etmek için kendine özgü farklı bir yapısı var. Bu yüzden "spell numbers" vb anahtar kelimelerle bulacağınız yabancı kaynaklı SQL fonksiyonlarındaki thousands, hundred, one, two gibi İngilizce kelimeleri Türkçeleri ile yerdeğiştirerek kullanmaya çalışmak hiç bir işe yaramayacaktır.

Bir sayıyı Türkçe olarak yazıya çevirmek için genelde Türk geliştiriciler tarafından oluşturulmuş fonksiyonları kullanmak gerekecektir. Ben de ihtiyaç duyanların kullanabilmesi için veya kendi SQL fonksiyonlarını yazmak istiyenlere yol gösterici olabilmesi umudu ile aşağıdaki udf_sayiyi_yaziya_cevirme isimli SQL fonksiyonunu yazdım.

Aşağıda kodlarını verdiğim udf_sayiyi_yaziya_cevirme isimli SQL fonksiyonunu iki parametre alıyor.
İlk parametre bigint sql veri tipinde sayının kendisi.
İkinci parametre is 0 veya 1 değerini alan sql bit veri tipinde. İstenilen sayınn yazıya çevrilmiş halinin büyük harflerle veya küçük harflerle istendiğine dair bir parametre.

Fonksiyon içinde kullanılacak değişkenler tanımlandıktan sonra, sayının toplam kaç basamaktan oluştuğu hesaplanıyor.
Bir SQL WHILE döngüsü içinde her basamak için rakam ve basamağın değeri göz önüne alınarak SQL CASE koşul cümlecikleri içerisinde istenilen metin @yaziilesayi değişkeni kullanılarak oluşturuluyor.

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

SQL fonksiyonunun son bölümleri SQL concatenation sırasında oluşabilecek fazladan boşluk karakterlerini (space character) temizlemek için SQL Replace fonksiyonunu kullanmak ve SQL trim fonksiyonarı LTRIM ve RTRIM 'i kullanmaktan ibaret.

Yukarıda kaynak kodunu paylaştığım udf_sayiyi_yaziya_cevirme sql fonksiyonu veya sayıları yazıya çeviren sql fonksiyonunu ihtiyacınıza göre bir saklı yordam (stored procedure) içinde de kullanabilirsiniz.

Sayıların metin yazılışlarını udf_sayiyi_yaziya_cevirme fonksiyonu ile SQL kodlarınızda aşağıdaki örnekte görüldüğü gibi elde edebilirsiniz. Dilerseniz fonksiyonun döndürdüğü nvarchar() tipindeki yazıyı bir string değişkene atarak daha sonra kullanabilirsiniz.

select dbo.udf_sayiyi_yaziya_cevirme(1001,0) [Yazı ile Sayı]
union all
select dbo.udf_sayiyi_yaziya_cevirme(1001001,1)
union all
select dbo.udf_sayiyi_yaziya_cevirme(999,1)
union all
select dbo.udf_sayiyi_yaziya_cevirme(5000827,0)
union all
select dbo.udf_sayiyi_yaziya_cevirme(43094840,0)

Eğer Internet üzerinde araştırma yaparsanız daha pek çok örnek SQL kodu bulacağınızdan emin olabilirsiniz.
Doğru bir sayı-yazı çevrimi için dikkat etmeniz gereken özellikle binli sayılar. "Bir bin" şeklinde bir çevrim olmamalı.
Ayrıca bir milyon yüz gibi bir sayıda hiç binler basamağı kullanılmamış. Sayıları metine dönüştüren fonksiyon, bir şekilde "bin" biçiminde bir yazı parçası döndürüyor olabilir dikkat etmek gerekir.
Kendi çevrim fonksiyonunuzu yazmak isterseniz bu hususlara da dikkat ediniz.

sayıyı yazıya çeviren SQL fonksiyonu
SQL Server üzerinde geliştirme yapan SQL programcıları için sayıyı yazıya dönüştüren fonksiyon ve kullanım örnekleri

Son bir not, Internet üzerinde farklı diller için farklı kaynaklardaki çevrimleri de aramak istiyorsanız aşağıdaki anahtar kelimeleri kullanabilirsiniz:
spell numbers, number spelling, number to words, number to text, number into words, gibi







Related SQL Resources

SQL Server Articles

SQL Server 2012

SQL Server Tools

SQL Blog

SQL Server 2008 Blog

Certification Exams Blog

Reporting Services Blog

Analysis Services Blog

MS SQL Server Forums







Copyright © 2004 - 2017 Eralper YILMAZ. All rights reserved.
Community Server by Telligent Systems