BT Profesyonelleri ve Kullanıcılar için ipuçları
C Sharp

C# ile Sayı-Metin Dönüşümü

Bu makalede, C# kullanarak sayıları metne ve metinleri sayıya dönüştüren bir sınıf geliştireceğiz.
Bu sınıf, özellikle finansal uygulamalarda, çek yazım sistemlerinde, fatura oluşturma yazılımlarında
ve ses üreten yapay zekalara sayıların metine dönmüş hallerini vermek için kullanılabilir.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;

public static class NumberTextConverter
{
    // Sayıların yazılı halleri
    private static readonly string[] Birler = { "", "Bir", "İki", "Üç", "Dört", "Beş", "Altı", "Yedi", "Sekiz", "Dokuz" };
    private static readonly string[] Onlar = { "", "On", "Yirmi", "Otuz", "Kırk", "Elli", "Altmış", "Yetmiş", "Seksen", "Doksan" };
    private static readonly string[] Binler = { "", "Bin", "Milyon", "Milyar" };

    // Sayıyı metne çeviren metod
    public static string NumberToWords(decimal number)
    {
        if (number == 0) return "Sıfır";

        int tamKisim = (int)number; // Tam sayı kısmını al
        int kurusKisim = (int)((number - tamKisim) * 100); // Kuruş kısmını hesapla

        string tamMetin = ConvertNumberToText(tamKisim);
        string kurusMetin = kurusKisim > 0 ? ConvertNumberToText(kurusKisim) + " Kuruş" : "";

        return (tamMetin + (kurusMetin != "" ? " Lira " + kurusMetin : " Lira")).Trim();
    }

    // 1000'lik basamaklarla sayıyı yazıya döken metod
    private static string ConvertNumberToText(int number)
    {
        if (number == 0) return "Sıfır";

        string result = "";
        int binIndex = 0;

        while (number > 0)
        {
            int chunk = number % 1000;
            if (chunk > 0)
            {
                string chunkText = ConvertChunk(chunk);
                result = chunkText + (Binler[binIndex] != "" ? " " + Binler[binIndex] : "") + " " + result;
            }
            number /= 1000;
            binIndex++;
        }

        return result.Trim();
    }

    // 100'lük dilimlerde sayıyı metne çeviren metod
    private static string ConvertChunk(int number)
    {
        string result = "";

        if (number >= 100)
        {
            if (number / 100 == 1)
                result += "Yüz ";
            else
                result += Birler[number / 100] + " Yüz ";
            number %= 100;
        }

        if (number >= 10)
        {
            result += Onlar[number / 10] + " ";
            number %= 10;
        }

        if (number > 0)
        {
            result += Birler[number] + " ";
        }

        return result.Trim();
    }

    // Metni sayıya çeviren metod
    public static decimal WordsToNumber(string words)
    {
        if (string.IsNullOrWhiteSpace(words)) return 0;

        Dictionary<string, int> wordMap = new Dictionary<string, int>
        {
            { "Sıfır", 0 }, { "Bir", 1 }, { "İki", 2 }, { "Üç", 3 }, { "Dört", 4 }, { "Beş", 5 },
            { "Altı", 6 }, { "Yedi", 7 }, { "Sekiz", 8 }, { "Dokuz", 9 }, { "On", 10 }, { "Yirmi", 20 },
            { "Otuz", 30 }, { "Kırk", 40 }, { "Elli", 50 }, { "Altmış", 60 }, { "Yetmiş", 70 },
            { "Seksen", 80 }, { "Doksan", 90 }, { "Yüz", 100 }, { "Bin", 1000 }, { "Milyon", 1000000 },
            { "Milyar", 1000000000 }
        };

        decimal result = 0, current = 0;
        bool isKurus = false;
        string[] wordsArray = words.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

        foreach (string word in wordsArray)
        {
            if (word == "Lira")
            {
                result += current;
                current = 0;
            }
            else if (word == "Kuruş")
            {
                result += current / 100;
                isKurus = true;
                current = 0;
            }
            else if (wordMap.ContainsKey(word))
            {
                int num = wordMap[word];
                if (num == 100)
                    current = (current == 0 ? 1 : current) * num;
                else if (num >= 1000)
                {
                    if (current == 0) current = 1;
                    result += current * num;
                    current = 0;
                }
                else
                    current += num;
            }
        }

        return result + (isKurus ? 0 : current);
    }
}

// Örnek kullanım
class Program
{
    static void Main()
    {
        Console.WriteLine(NumberTextConverter.NumberToWords(123456.75m)); // "Yüz Yirmi Üç Bin Dört Yüz Elli Altı Lira Yetmiş Beş Kuruş"
        Console.WriteLine(NumberTextConverter.WordsToNumber("Yüz Yirmi Üç Bin Dört Yüz Elli Altı Lira Yetmiş Beş Kuruş")); // 123456.75
    }
}

Bir yorum ekleyin

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