Qt/C++ ile Sayları Türkçe Olarak Metine Çevirmek

Fatura diplerinde tutarın metine çevirilmesi gerekiyor. Ben de çıktılar alırken ihtiyaç duydum. Hali ile tam ve ondalık sayı olmak üzere iki kısım olduğu için iki ayrı rakamı da ayrıca sayıya çevirmek gerekiyor.

QString baglanti::yaziyla(double gelenRakam)
{
    int tam;
    double kusur;
    QString takas;

    tam = gelenRakam;
    kusur = gelenRakam - tam;

    takas = QString::number(kusur, 'f', 2);    

    QStringList parca = takas.split(".");

    return yaziyaCevir(tam) + "TL"+yaziyaCevir(parca.last().toInt())+"KRŞ";

}

Yukarıdaki gibi bir fonksiyon ile işe başlıyoruz. Burada sayı tam ve ondalık kısmına ayrılıyor ve ayrı ayrı metine çevriliyor.

QString baglanti::yaziyaCevir(int gelenInt)
{
    QString birlik[10] = {"", "BİR", "İKİ", "ÜÇ", "DÖRT", "BEŞ", "ALTI", "YEDİ", "SEKİZ", "DOKUZ"};
    QString onluk[10] = {"", "ON", "YİRMİ", "OTUZ", "KIRK", "ELLİ", "ALTMIŞ", "YETMİŞ", "SEKSEN", "DOKSAN"};
    QString yuzluk[10] = {"", "YÜZ", "İKİYÜZ", "ÜÇYÜZ", "DÖRTYÜZ", "BEŞYÜZ", "ALTIYÜZ", "YEDİYÜZ", "SEKİZYÜZ", "DOKUZYÜZ"};
    QString bolum[11] = {"BİN", "MİLYON", "MİLYAR", "TRİLYON", "KATRİLYON", "KENTİLYON", "SEKSTİLYON", "SEPTİLYON", "OKTİLYON", "NONİLYON", "DESİLYON"};



    QString gelenMetin = QString::number(gelenInt);

    QString sonuc="";

    int basamak = 1;
    int bol = 0;


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

        switch (basamak) {
        case 1:            
            sonuc = birlik[gelenMetin.mid(i-1,1).toInt()] + sonuc;            
            break;
        case 2:
            sonuc = onluk[gelenMetin.mid(i-1,1).toInt()] + sonuc;            
            break;
        case 3:
            sonuc = yuzluk[gelenMetin.mid(i-1,1).toInt()] + sonuc;            
            break;
        }

        basamak = basamak +1;

        if(basamak > 3)
        {
            if(i!=1) sonuc = bolum[bol]+sonuc;
            basamak=1;
            bol=bol+1;
        }

    }

    //return sonuc; //BİRBİN hatası vardı.
    
// Alttaki kod ile dönen değerin başında BİRBİN varsa kaldırıyor.
    if (sonuc.mid(0,6)!="BİRBİN") return sonuc; else return sonuc.mid(3);


}

Burada rakamı binlik bölümlerine yani üçlü bölümlerine ayrılarak yazıya çevirdim. Sadece 1000’de sıkıntı var! “BİRBİN” yazıyor… 🙂

Valla çok kasmadım! O kadarı kadı kızında da olur. Yoğunluğum biraz azaldığında çaresine bakacağım. Şu an için bu kadar kodu yazabilmek için harcadığım zaman bile lüks… 🙂

Düzenleme:
QtRPT isimli çok ama çok faydalı bir raporlama kütüphanesi buldum. Kütüphane içerisinde dahili YazıyaÇevirme fonksiyonu vardı ama Türkçe yoktu!
Onu da ben ekleyeyim dedim. Maksat; kullanıyoruz, katkı koyalım. O arada da yukarıdaki kodu ekledim ve sıkıntı bitti… 🙂

Bu yazı Programlama kategorisine gönderilmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kodu girin... *