C# - Számértékek megjelenítése szöveggel

forráskód letöltése
Gyakran előfordul, hogy egy nyomtatványon egy számot szöveggel is meg kell jeleníteni (pl. csekkek, számlák). Cikkünkben egy olyan metódust készítünk és használunk fel a mellékelt alkalmazásban, mely tetszőleges bemenő egész számot (pénzértéket) képes karakteres formában, a szabályoknak megfelelően tagolva, és szükség szerint szeparátor-karakterrel kiegészítve visszaadni.
A műveletvégző MoneyToString metódust egy osztály statikus függvényeként hozzuk létre. A létrehozandó metódus az 1 milliárdos nagyságrend alatti értékeket képes szöveggé konvertálni.
Létrehoztunk tehát egy Converter nevű osztályt az alkalmazás NTSConverter névterében, melyet a Converter.cs állományban helyezünk el:
using System;
namespace NTSConverter
{
  public class Converter
  {
Deklarálunk három tömböt a karakterláncoknak, melyeket meghatározott logika szerint adunk az eredmény-karakterlánchoz.
    private static string[] CONES = {"", "egy", "kettő", "három", "négy", "öt", "hat", "hét", "nyolc", "kilenc"};
    private static string[] CTENS = {"", "tíz", "húsz", "harminc", "negyven", "ötven", "hatvan", "hetven", "nyolcvan", "kilencven"};
    private static string[] CUTAG = {"", "ezer", "millió"};
Felveszünk egy változót az eredmény karakterlánc számára, valamint egyet az esetleges elválasztás-jel tárolására, melyet 2000-nél nagyobb értékű számok esetén szúrunk be a karakterláncba, a helyesírási szabályoknak megfelelően.
    private static string sep = "";
    private static string resultString = "";
A statikus metódusnak szüksége van néhány műveletre, melyeket szintén statikus metódusokban helyeztünk el, hogy azok elérhetők legyenek az osztály példányosítása nélkül. Az első művelet a paraméterként kapott karakterláncot az eredmény lánc elé szúrja, valamint megvizsgálja, hogy szükséges-e elválasztójelet beszúrni a karakterláncba. Szükség esetén beszúrja:
    private static void AddNum(string ns,Int64 money)
    {
      resultString = ns + resultString;
      if ((resultString != "") && (money > 2000))
      {
        sep = "-";
      }
    }
A második műveletben a CONES tömb egy elemét adja vissza a metódus attól függően, hogy a megadott számérték karakterlánccá alakítva milyen hosszal rendelkezik:
    private static string Ones(string moneyStr,int moneyStrLen)
    {
      string res = CONES[Convert.ToByte(moneyStr[moneyStrLen-1]) - 48];
      return res;
    }
A harmadik művelet a CTENS karaktertömb egy elemét adja vissza attól függően, hogy éppen melyik elemét vizsgáljuk a számértékből képzett karakterláncnak:
    private static string Tens(string moneyStr,int moneyStrLen)
    {
      string res = "";
      switch(moneyStr[moneyStrLen])
      {
Ha az adott karakter 1, akkor két értéket adhat vissza a függvény attól függően, hogy a karaktert nulla követi vagy sem:
        case '1':
          if (moneyStr[moneyStrLen+1] == '0')
          {
            res = "tíz";
          }
          else
          {
            res = "tizen";
          }
          break;
Csakúgy, mint 2 esetén:
        case '2':
          if (moneyStr[moneyStrLen+1] == '0')
          {
            res = "húsz";
          }
          else
          {
            res = "huszon";
          }
          break;
Minden egyéb esetben:
        default:
          res = CTENS[Convert.ToByte(moneyStr[moneyStrLen]) - 48];
          break;
      }
      return res;
    }
A MoneyToString metódus pedig a következőképpen épül fel: először deklarálunk néhány segédváltozót, majd megvizsgáljuk, hogy a megadott érték nulla, vagy sem:
    public static string MoneyToString(Int64 money)
    {      
      resultString = "";
      sep = "";
      string moneyStr = "";
      int moneyStrLen = 0;
      int i1 = 0;
      int i2 = 0;
      int i3 = 0;
      if (money != 0)
      {
Ha nem nulla, akkor ellenőrizzük, hogy a megadott szám tíznél kisebb számjegy hosszú-e:
        moneyStr = Convert.ToString(Math.Abs(money));
        moneyStrLen = moneyStr.Length;
        if (moneyStrLen < 10)
        {
Ha igen, akkor elindítunk egy ciklust, melyben csökkentjük a karakterlánc hosszát megadó értéket, amíg az nagyobb, mint 0:
          while (moneyStrLen > 0)
          {
            ...
            moneyStrLen--;
          }
A logika lényege, hogy a megadott számot reprezentáló karakterláncot elemezve fűzzük a lánc elejére a részláncokat, míg végül megkapjuk a teljes szöveget. Természetesen a negatív számok kezelése is megvalósul, ennek érdekében egy ’mínusz’ szó kerül a szöveg elejére:
          if (money < 0)
          {
            resultString = "mínusz " + resultString;
          }
        }
A tíz karakternél hosszabb számok esetén hibajelzést adunk:
        else
        {
          resultString = "Az érték túl nagy, így nem konvertálható! A konvertálás 9 számjegyig működik!";
        }
      }
Nullát megadva konvertálandó értékként a ’nulla’ szót adjuk vissza:
      else
      {
        resultString = "nulla";
      }      
      return resultString;
    }
  }
}
A programban felhasználjuk a MoneyToString statikus metódust, a ’Konvertálás’ feliratú gombra kattintva a megadott számérték az ’Eredmény’ feliratú szövegmezőben jelenik meg konvertálva.