Bu yazıda bir sayının yazıya nasıl çevirebileceğimiz
hakkında bir yol göstereceğim, dil olarak C# kullanılacaktır. Öncelikle
belirteyim ki programlama ve C# konusunda çok yeniyim. Hemen hemen tüm
bildiklerimi bu siteye borçluyum.
Aşağıdaki kodda bulunan
Oku fonksiyonu kendisine string
olarak gönderilen tam sayıyı yazıya çevirmektedir.
Kodun çalışma mantığı şöyledir.
oku fonksiyonuna gönderilen string başına "0"
eklemek suretiyle önce 15 haneye tamamlanır, sonra yeni string 3 erli kümeler
halinde 5 eşit parçaya bölünür ve her bir üçlü küme tek tek
rakam dizisine
yüklenir. Böylece 5 elemanlı rakam dizisinin her bir elemanında 3
karakterli bir string yüklü olur.
1.Aşama
sayımız 32313234 olsun. ilk olarak sayımızın
hane sayısını başına 0 eklemek sureti ile 15 e çıkarırız.
Böylece yeni stringimiz 000000032313234 şeklini alır.
2.Aşama
Stringimiz 3 erli kümeler halinde 5 eşit parçaya
bölünür.
1. küme : 000
2. küme : 000
3. küme : 032
4. küme : 313
5. küme : 234
3.aşama
her bir küme 5 elemanlı rakam isimli araya yüklenir ve
sonuçta
rakam[0] = "000"
rakam[5] = "234"
olur
rakam[5][0]="2" 5. kümenin yüzler basamağı;
rakam[5][1]= "3" 5. kümenin onlar basamağı;
rakam[5][2]= "4" 5. kümenin birler basamağı;
olur.
4.aşama
10 elemanlı
yüzler, onlar, birler string dizileri
tanımlanır ve i çleri
doldurulur.
örn:
yuzler.SetValue("ikiyuz",2);
onlar.SetValue("otuz",3);
birler.SetValue("dört",4);
yani yuzler[2]+onlar[3]+birler[4] = ikiyüzotuzdört
olur.
int x
=Convert.ToInt16(rakam[5][0].ToString()); yüzler
int y
=Convert.ToInt16(rakam[5][1].ToString()); onlar
int z
=Convert.ToInt16(rakam[5][2].ToString()); birler
yuzler[x]+onlar[y]+birler[z] = ikiyüzotuzdört
bir döngü ile her bir kümeye bu işlemi uygularsanız,
1 ve ikinci kümlerin bütün elemanları sıfır olduğu için sonuçta
otuzdört
üçyüzonuç
ikiyüzotuzdört
ü elde edersiniz
5.Aşama
hane
isimli 5 li array tanımlanır ve elemanları trilyon, milyar, milyon, bin ve
sonuncusu da boş olacak şekilde ayarlanır. aynı döngü içerisinde her bir
kümenin sonuna eklenir
string
sonuc = "";
for(int
i = 0 ; i < 5;i++)
{
sonuc = sonuc +
yuzler[Convert.ToInt16(rakam[i][0].ToString())]+
onlar[Convert.ToInt16(rakam[i][1].ToString())]+
birler[Convert.ToInt16(rakam[i][2].ToString())]+
hane[i];
}
Burada ayarlanması gereken durum eğer bir kümenin
bütün elemanları sıfırsa (yukarıdaki gibi) hanenin gözükmemesi gerekir. Yani
000 = yuzler[0]+onlar[0]+birler[0]+hane[0] dersek
sonuç trilyon olur bu durumda
if(rakam[0].ToString()!=
"000")
hane.SetValue("trilyon ",0);
if(rakam[1].ToString()!= "000")
hane.SetValue("milyar ",1);
if(rakam[2].ToString()!=
"000")
hane.SetValue("milyon ",2);
if(rakam[3].ToString()!=
"000")
hane.SetValue("bin ",3);
yani rakam[0] (trilyon kümesi) "000" değilse hane[0] =
"trilyon" olsun demeliyiz.
Yanlız bir sorun daha var. eğer sayı 1000 ise
fonksiyon bize haklı olarak "birbin" i döndürür. Bir milyar var,
Bir Milyon var ama bir bin ve bir yüz yok. Ben bu sorunu BirSorunu isimli
fonksiyonla hallettim.
Aşağıdaki kodu inceleyebilirsiniz.
using
System;
namespace
numbereader
{
public
class SayiOkuma
{
privatestring[
] yuzler =newstring[10];
private
string[ ] onlar =new
string[10];
private
string[ ] birler =new
string[10];
private
string[ ] hane = new
string[5];
private
string[ ] rakam
=newstring[5];
//
arrayları tanımlıyoruz
public
SayiOkuma()
{
// içlerini dolduruyoruz
yuzler.SetValue("dokuzyüz",9);
yuzler.SetValue("sekizyüz",8);
yuzler.SetValue("yediyüz",7);
yuzler.SetValue("altıyüz",6);
yuzler.SetValue("beşyüz",5);
yuzler.SetValue("dörtyüz",4);
yuzler.SetValue("üçyüz",3);
yuzler.SetValue("ikiyüz",2);
yuzler.SetValue("yüz",1);
yuzler.SetValue("",0);
onlar.SetValue("doksan",9);
onlar.SetValue("seksen",8);
onlar.SetValue("yetmiş",7);
onlar.SetValue("altmış",6);
onlar.SetValue("elli",5);
onlar.SetValue("kırk",4);
onlar.SetValue("otuz",3);
onlar.SetValue("yirmi",2);
onlar.SetValue("on",1);
onlar.SetValue("",0);
birler.SetValue("dokuz",9);
birler.SetValue("sekiz",8);
birler.SetValue("yedi",7);
birler.SetValue("altı",6);
birler.SetValue("beş",5);
birler.SetValue("dört",4);
birler.SetValue("üç",3);
birler.SetValue("iki",2);
birler.SetValue("bir",1);
birler.SetValue("",0);
hane.SetValue("",0);
hane.SetValue("",1);
hane.SetValue("",2);
hane.SetValue("",3);
hane.SetValue("",4);
/* ilk olarak bu arrayın
elemanlarını boş olarak ayarlıyoruz eğer küme elemanları
000 değilse trilyon,milyar,milyon bin değerleri ile dolduruyoruz
*/
}
public
string oku(string
sayi)
{
int
uzunluk = sayi.Length;
if(uzunluk > 15)
return
"Hata girilen değerin uzunluğu en fazla 15 olmalı";
// uzunluk 15 karakterden fazla olmamalı. si
try
{
long k =
Convert.ToInt64(sayi);
}
catch(Exception
ex)
{
return ex.Message.ToString();
}
sayi = "000000000000000"+sayi;
sayi = sayi.Substring(uzunluk,15);
rakam.SetValue(sayi.Substring(0,3),0);
rakam.SetValue(sayi.Substring(3,3),1);
rakam.SetValue(sayi.Substring(6,3),2);
rakam.SetValue(sayi.Substring(9,3),3);
rakam.SetValue(sayi.Substring(12,3),4);
if(rakam[0].ToString()!=
"000")
hane.SetValue("trilyon ",0);
if(rakam[1].ToString()!=
"000")
hane.SetValue("milyar ",1);
if(rakam[2].ToString()!=
"000")
hane.SetValue("milyon ",2);
if(rakam[3].ToString()!=
"000")
hane.SetValue("bin ",3);
string sonuc
= "";
for(int
i = 0 ; i < 5;i++)
{
sonuc = sonuc +
yuzler[Convert.ToInt16(rakam[i][0].ToString())]+
birsorunu(onlar[Convert.ToInt16(rakam[i][1].ToString())]+birler[Convert.ToInt16(rakam[i][2].ToString())]+hane[i]);
}
return sonuc;
}
privatestring
birsorunu (string sorun)
{
string
cozum = "";
if
(sorun == "birbin ")
cozum = "bin ";
else
cozum = sorun;
return cozum;
}
}
}
|
Herkese kolay gelsin. Bu arada dileyene DLL i
gönderebilirim. İyi çalışmalar.
Makale:
Sayıları Yazıya Çevirme Örneği C#, Visual C# ve .NET Tolga Güler
|