09 Nisan 2009

Rakamları Yazıya Çevirme

Merhaba,


Birçok yerde görürüz hep. Parasal değerlerin yazı ile belirtilmesi. Mesela dekont, gider pusulası vs. yerlerde. İnternette bu konuda yazılmış bir kod aradım ama Türkçe yapısına uygun ve anlaşılması kolay bulamadım.  https://www.informit.com/articles/article.aspx?p=342034&seqNum=3 adresindeki algoritma hem sadeliği hem de işleme biçimi ile ilgimi çekti. Gerçi bu makale kod hatalarını düzeltme pratiği için bu örneği vermiş ama herkes nasibinden faydalanır işte. Türkçe için düşününce bazı kısımları değiştirmek zorunda kaldım. Farklı yerlede de çalışır şekilde düzenledim.  

 

Çalışma mantığı şu şekilde özetle : Sayısı üçlük yapıda değerlendiriyor. Mesela 330.444' için önce 330'luk kısmı ele alıyor, sonra 444'lük kısmı. Her işlem sonucu sayısı kata bölüyor ve kalanı sayıya atıyor. Böylelikle 3'er geri gitmiş oluyor.

 

Umarım ihtiyacı olanlara faydalı olur. Ben şuan uğraştığım Gider Pusulası basımında kullanıyorum.

 

import java.math.BigDecimal;


public class TurkishNumber {

      private static final String[] birler = { " BİR", " İKİ", " ÜÇ", " DÖRT", " BEŞ", " ALTI", " YEDİ", " SEKİZ", " DOKUZ"};

      private static final String[] onlar = {" ON", " YİRMİ", " OTUZ", " KIRK", " ELLİ", " ALTMIŞ", " YETMİŞ", " SEKSEN", " DOKSAN" };

      private static final String[] katlar = { "", " BİN", " MİLYON", " MİLYAR", " TRİLYON"};

 

      public static void main(String[] args) {

            System.out.println("0 : " + TurkishNumber.sayi2YaziForParaFormatli(0));

            System.out.println("1 : " + TurkishNumber.sayi2YaziForParaFormatli(1));

            System.out.println("12 : " + TurkishNumber.sayi2YaziForParaFormatli(12));

            System.out.println("100 : " + TurkishNumber.sayi2YaziForParaFormatli(100));

            System.out.println("1234 : " + TurkishNumber.sayi2YaziForParaFormatli(1234));

            System.out.println("12345 : " + TurkishNumber.sayi2YaziForParaFormatli(12345));

            System.out.println("123456 : " + TurkishNumber.sayi2YaziForParaFormatli(123456));

            System.out.println("1234567 : " + TurkishNumber.sayi2YaziForParaFormatli(1234567));

            System.out.println("12345678 : " + TurkishNumber.sayi2YaziForParaFormatli(12345678));

            System.out.println("123456789.00 : " + TurkishNumber.sayi2YaziForParaFormatli(123456789));

            System.out.println("1234567890.9 : " + TurkishNumber.sayi2YaziForParaFormatli(1234567890.9));

            System.out.println("12345678.90 : " + TurkishNumber.sayi2YaziForParaFormatli(12345678.90));

            System.out.println("12345678.09 : " + TurkishNumber.sayi2YaziForParaFormatli(12345678.09));      

            System.out.println("123456789123.89 : " + TurkishNumber.sayi2YaziForParaFormatli(123456789123.89));

      }

 

      public static String sayi2Yazi(long sayi) {

            StringBuffer sonuc = new StringBuffer();

            // Go through the number one group at a time.

            for (int i = katlar.length - 1; i >= 0; i--) {

                  // Is the number as big as this group?

                  long cutoff = (long) Math.pow((double) 10, (double) (i * 3));

                  if (sayi >= cutoff) {

                        int thisPart = (int) (sayi / cutoff);

                        if (thisPart >= 100) {

                              if (thisPart / 100 > 1) {

                                    sonuc.append(birler[thisPart / 100 -1]);

                              }

                              sonuc.append(" YÜZ");

                              thisPart = thisPart % 100;

                        }

                        if (thisPart >= 10) {

                              sonuc.append(onlar[(thisPart / 10) - 1]);

                              thisPart = thisPart % 10;

                        }

                        if (thisPart >= 1) {

                              if (!(cutoff == 1000 && thisPart == 1)) {

                                    sonuc.append(birler[thisPart-1]);

                              }

                        }

                        sonuc.append(katlar[i]);

                        sayi = sayi % cutoff;

                  }

            }

 

            if (sonuc.length() != 0) {

                  sonuc.deleteCharAt(0);

            }

            return sonuc.toString();

      }

     

      public static String[] sayi2YaziForPara(double para) {

            String[] sonuc = new String[]{"", ""};

            if (para == 0) return sonuc;

            String strPara = new BigDecimal(para).setScale(2, 4).toString();

            int dotIndex = strPara.indexOf(".");

            long kusurat = Long.valueOf(String.valueOf(strPara).substring(dotIndex+1));

            sonuc[0] =  sayi2Yazi((long)para);

            if (kusurat > 0) {

                  sonuc[1] = sayi2Yazi(kusurat);

            }

            return sonuc;

      }

     

      public static String sayi2YaziForParaFormatli(double para) {

            StringBuffer sonuc = new StringBuffer();

            String[] sonucListesi = sayi2YaziForPara(para);

            if (!sonucListesi[0].isEmpty()) {

                  sonuc.append(sonucListesi[0]);

                  sonuc.append(" TL");

                  if (!sonucListesi[1].isEmpty()) {

                        sonuc.append(" ");

                        sonuc.append(sonucListesi[1]);

                        sonuc.append(" KURUŞ");                  

                  }

            }    

            return sonuc.toString();

      }

}

 

0 :

1 : BİR TL

12 : ON İKİ TL

100 : YÜZ TL

1234 : BİN İKİ YÜZ OTUZ DÖRT TL

12345 : ON İKİ BİN ÜÇ YÜZ KIRK BEŞ TL

123456 : YÜZ YİRMİ ÜÇ BİN DÖRT YÜZ ELLİ ALTI TL

1234567 : BİR MİLYON İKİ YÜZ OTUZ DÖRT BİN BEŞ YÜZ ALTMIŞ YEDİ TL

12345678 : ON İKİ MİLYON ÜÇ YÜZ KIRK BEŞ BİN ALTI YÜZ YETMİŞ SEKİZ TL

123456789.00 : YÜZ YİRMİ ÜÇ MİLYON DÖRT YÜZ ELLİ ALTI BİN YEDİ YÜZ SEKSEN DOKUZ TL

1234567890.9 : BİR MİLYAR İKİ YÜZ OTUZ DÖRT MİLYON BEŞ YÜZ ALTMIŞ YEDİ BİN SEKİZ YÜZ DOKSAN TL DOKSAN KURUŞ

12345678.90 : ON İKİ MİLYON ÜÇ YÜZ KIRK BEŞ BİN ALTI YÜZ YETMİŞ SEKİZ TL DOKSAN KURUŞ

12345678.09 : ON İKİ MİLYON ÜÇ YÜZ KIRK BEŞ BİN ALTI YÜZ YETMİŞ SEKİZ TL DOKUZ KURUŞ

123456789123.89 : YÜZ YİRMİ ÜÇ MİLYAR DÖRT YÜZ ELLİ ALTI MİLYON YEDİ YÜZ SEKSEN DOKUZ BİN YÜZ YİRMİ ÜÇ TL SEKSEN DOKUZ KURUŞ


6 yorum:

Adsız dedi ki...

package proje; // Klavyeden girilen 3 haneli bir sayının türkçe ifadesini ekrana yazan program:
import java.util.Scanner;
public class Main {
public void oku() {
switch(yuzler) {
case 1: System.out.print("yüz"); break;
case 2: System.out.print("ikiyüz"); break;
case 3: System.out.print("üçyüz"); break;
case 4: System.out.print("dörtyüz"); break;
case 5: System.out.print("beşyüz"); break;
case 6: System.out.print("altıyüz"); break;
case 7: System.out.print("yediyüz"); break;
case 8: System.out.print("sekizyüz"); break;
case 9: System.out.print("dokuzyüz"); break;
default: break;
}
switch(onlar) {
case 1: System.out.print("on"); break;
case 2: System.out.print("yirmi"); break;
case 3: System.out.print("otuz"); break;
case 4: System.out.print("kırk"); break;
case 5: System.out.print("elli"); break;
case 6: System.out.print("altmış"); break;
case 7: System.out.print("yetmiş"); break;
case 8: System.out.print("seksen"); break;
case 9: System.out.print("doksan"); break;
default: break;
}
switch(birler) {
case 1: System.out.println("bir"); break;
case 2: System.out.println("iki"); break;
case 3: System.out.println("üç"); break;
case 4: System.out.println("dört"); break;
case 5: System.out.println("beş"); break;
case 6: System.out.println("altı"); break;
case 7: System.out.println("yedi"); break;
case 8: System.out.println("sekiz"); break;
case 9: System.out.println("dokuz"); break;
default: break;
}
}
public static void main(String[] args) {
Scanner x=new Scanner(System.in);
int sayi=x.nextInt();
int yuzler=sayi/100;
int onlar=(sayi-yuzler*100)/10;
int birler=(sayi-yuzler*100)-(onlar*10);
Main y=new Main();
y.oku();
}
}
sence nası güzel yazmışmıyım :D biz buraya kadar gördük bundan ilerisini görmedik

Adsız dedi ki...

BigDecimal'e cevirmeyi akıl eden şimdiye kadar gördüğüm tek örnek. Teşekkürler.

Adsız dedi ki...

Merhaba çok güzel olmuş. lakin
on binler basamağında, 1'le ilgili sıkıntı var.
mesela;
11111 sayısını "ON BİN YÜZ ON BİR" şeklinde okuyor.
111111 "YÜZ ON BİN..."
211111 "İKİ YÜZ ON BİN.."
şeklinde devam ediyor.
"BİR BİNİ" görmüyor

Adsız dedi ki...

sayi2Yazi fonksiyonun içinde ki
--------
if (!(cutoff == 1000 && thisPart == 1)) {

sonuc.append(birler[thisPart-1]);

}
--------------------------------
bu if bloğunun hemen ardından tersi olan bu if bloğunu ekledim ve on binler basamığına 1 geldiğinde okunmayan "BİR" yazısı sorununu çözdüm. öyle gözüküyor en azından. if bloğu böyle oldu yani, son olarak,,
-------son--------
if (!(cutoff == 1000 && thisPart == 1)) {

sonuc.append(birler[thisPart-1]);

}

if ((cutoff == 1000 && thisPart == 1)) {

sonuc.append(birler[thisPart-1]);

}

kaynak kodlar için çok teşekkürler. muhasebe işlem fişi oluştururken kullanacağım.

Murat ŞEKER dedi ki...

Güzel bir paylaşım. Tam aradığım şey. Projemde de kullandım. Teşekkürler Adaş...

Unknown dedi ki...

selamlar,
okunmayan 1 için ve 1 olduğunda başına "bir bin" eklememesi için şunu ekleyebilirsiniz.

if(!(cutoff == 1000 && thisPart == 1 && String.valueOf(sayi).startsWith("1") ) ){
sonuc.append(birler[thisPart-1]);
}