Una din luptele pe care le duce un programator este afisarea informatiei formatata pentru cultura in care ruleaza o aplicatia. Nu este nimic complicat daca lasi sistemul sa formateze asa cum stie el, insa problema apare in momentul in care benficiarii carcotasi si tipicari cer ca afisarea datelor sa se faca intr-un anume format, altul decat cel implicit din sistem. Menirea librariei i18N este sa rezolve problema prezentarii acestora functie de cultura aplicatiei, folosind elemente de formatare predefinite. 

Se disting 3 situatii care necesita formatare:

  • afisarea informatiei in scopul vizualizarii prin transformarea unei valori numerice sau date calendaristice in informatie de tip string, 
  • afisarea informatiei in scopul editarii prin transformarea unei valori numerice sau date calendaristice in informatie de tip string,
  • interpretarea informatiei din campurile de editare si prin transformarea unui string in valoare numerica sau date calendaristica.

Primele 2 situatii sunt rezolvate prin folosirea clasei Formater din libraria i18N. Diferenta intre cele 2 situatii poate fi explicata de modul de formatare a datelor. De exemplu, o data calendaristica poate fi afisata pentru vizualizare cu luna in format textual "18-Feb-2009", iar pentru editare in format numeric "18.02.2009". Aceasta diferenta se face doar prin folosirea altor string-uri de formatare: astfel pentru afisarea in forma 18-Feb-2009 folosim formatarea dd-MMM-yyyy, iar pentru afisarea in forma 18-02-2009 folosim formatarea dd.MM.yyyy.

A treia situatie este rezolvata prin utilizarea clasei Parser din libraria i18N. Aceasta clasa are menirea de a transforma un string reprezentand un anume tip de data in insasi tipul respectiv.

Proiectul .NET 2005 implementand libraria i18N se poate descarca accesand link-ul de mai jos:
Descarca i18N

using System;
using System.Globalization;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using ro.atypIQ.LL.i18n;

namespace ro.atypIQ.LL.tests.dao
{
    public class FormatterTests
    {
        CultureInfo locale = Thread.CurrentThread.CurrentUICulture;

        Boolean boolv = Boolean.Parse("true");
        Int16 shortv = Int16.Parse("123");
        Int32 intv = Int32.Parse("123456345");
        Int64 longv = Int64.Parse("12345634556568768");
        Single singlev = Single.Parse("1.23");
        Double doublev = Double.Parse("12.432");
        DateTime datev = DateTime.Now;


        private IPatternFormater getPatternFormater()
        {
            IPatternFormater patternFormater = new PatternFormater(locale);

            //peste formatul standard al culturii, venim cu formatarine noastre specifice. 
            patternFormater.DatePatern = "dd.MM.yyyy";
            patternFormater.TimePatern = "HH:mm:ss";
            patternFormater.UseGroupSepChar = true;
            patternFormater.DecimalDigits = 3;
            patternFormater.DecimalSepCharPatern = ".";
            patternFormater.GroupSepCharPatern = ",";

            return patternFormater;
        }

        public void editViewFormatterTest()
        {
            IFormater viewFormater = new Formater(getPatternFormater());

            String boolval = viewFormater.formatBoolean(ref boolv);
            String vshort = viewFormater.formatShort(ref shortv);
            String vint = viewFormater.formatInteger(ref intv);
            String vlong = viewFormater.formatLong(ref longv);
            String vfloat = viewFormater.formatFloat(ref singlev);
            String vDouble = viewFormater.formatDouble(ref doublev);
            String vtime = viewFormater.formatTime(ref datev);
            String vdate = viewFormater.formatDate(ref datev);
            String vtimestamp = viewFormater.formatTimestamp(ref datev);

            String aValueType = "";
            aValueType = viewFormater.formatDecimal(Int16.Parse("123"));
            aValueType = viewFormater.formatDecimal(Int16.Parse("123"), 7);
            aValueType = viewFormater.formatDecimal(Int32.Parse("123456"));
            aValueType = viewFormater.formatDecimal(Int32.Parse("123456"), 7);
            aValueType = viewFormater.formatDecimal(Int64.Parse("1234563543456"));
            aValueType = viewFormater.formatDecimal(Int64.Parse("1234563543456"), 7);
            aValueType = viewFormater.formatDecimal(Single.Parse("1.23"));
            aValueType = viewFormater.formatDecimal(Single.Parse("1.23"), 7);
            aValueType = viewFormater.formatDecimal(Double.Parse("12.432"));
            aValueType = viewFormater.formatDecimal(Double.Parse("12.432"), 7);

            aValueType = viewFormater.formatBigDecimal(Decimal.Parse("123.21234566"), 6);
        }

        public void editLLParserTest()
        {
            IParser editParser = new Parser(getPatternFormater());

            bool tval = (bool)editParser.parseBoolean("1");
            bool fval = (bool)editParser.parseBoolean("0");

            Int16 shortval = (Int16)editParser.parseShort("124");
            Int32 intval = (Int32)editParser.parseInteger("12454334");
            Int64 longval = (Int64)editParser.parseLong("12345634556568768");

            DateTime dateval = (DateTime)editParser.parseDate("1/12/2007");
            DateTime timeval = (DateTime)editParser.parseTime("11:34:43");
            DateTime timestampval = (DateTime)editParser.parseTimestamp("1/12/2007 11:34:43");

            Decimal decimalval = (Decimal)editParser.parseBigDecimal("123.212");
            Double doubleval = (Double)editParser.parseDouble("123.212");
            Single floatVal = (Single)editParser.parseFloat("123.212");

        }

    }
}

Puteti gasi o implementare a librariei i18N pentru Java citind postul Librarie Java i18M.