A következő címkéjű bejegyzések mutatása: globalization. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: globalization. Összes bejegyzés megjelenítése

2016. január 2., szombat

CurrentCulture eltérő nyelvű rendszereken

Sokszor előjön az igény, hogy a kódban használjunk valami lokalizációhoz kötött logikát, ami lehet akár csak egyszerűen egy törtszám értelmezése is stringből vagy esetleg az, hogy egy adott karakterlánc mivel kezdődik. Az ilyen esetekben kézenfekvő választásnak tűnik a CultureInfo.CurrentCulture tulajdonság, hiszen pont erre való: területi beállításokat tartalmaz. 

Például Magyarországon egy átlagos magyar nyelvű Windows rendszeren ez tökéletesen működik tört számok értelmezésére:

float number = float.Parse("20,16", CultureInfo.CurrentCulture);
//number = 20,16

Viszont ez a kód hibásan működik az átlagos amerikai Windows verziókban, pontosabban minden olyan környezetben, ahol a területi beállítások között a program készítésekor tesztelt és elvárt formátumértékektől eltérőek vannak beállítva. Ha, mondjuk, valaki Magyarországon egy külföldi verziót használ gyári adatokkal, akkor a fenti kódban a tört számból kihagyja a tizedesvesszőt, mivel azt az ezres szeparátorának tekinti.

A CultureInfo.CurrentCulture az adott szálhoz tartozó CultureInfot adja vissza, ezért .NET 4-ben és az előtti verziókban minden esetben, amikor biztosra akarunk menni, szálanként meg kell adni, hogy milyen lokalizációt használjon. Szerencsére az újabb .NET-ben beállítható application domain szinten is, hogy mi legyen az alapértelmezett a CultureInfo.DefaultThreadCurrentCulture segítségével. Ezzel elegendő egyszer, az alkalmazás indulásakor beállítani a kívánt lokalizációt.


CultureInfo.DefaultThreadCurrentCulture = 
CultureInfo.CreateSpecificCulture("hu-HU");

...

float number = float.Parse("20,16", CultureInfo.CurrentCulture);
//number = 20,16

CSV vessző vagy pontosvessző probléma

Előfordulhat, hogy Microsoft EXCEL-ben megnyitva egy CSV (Comma Separated Values) fájlt, az EXCEL nem találta meg, hogy hol is vannak a mezőhatárok, így pedig az első cellába tesz bele mindent. Ennek oka megegyezik azzal, amikor EXCEL-ből exportálunk CSV-be és nem pontosvessző lesz a szeparálókarakter.

Az alapvető probléma az, hogy az CSV-ben eredetileg a vessző (,) az elválasztó. Ehhez megfelelően az amerikai Windows verziókban a vessző az alapértelmezett Listaelválasztó (List Separator), ami a CSV-nek tökéletes. Ezzel szemben az európai verzióban a vessző a Tizedesjel (Decimal Symbol), és a Listaelválasztónak alapértelmezetten a pontosvessző (;) van megadva.

Az EXCEL-be való importáláshoz egy lehetséges megoldás, hogy ha CSV helyett TXT a kiterjesztés, mivel akkor megnyitáskor a megnyíló varázslóban kiválasztható, hogy mi a szeparátor.

Importálás és exportálás során egyaránt használható módszer (lehet, de nem ajánlott), ha lecseréljük a CSV fájlban az összes pontosvesszőt (;) egyszerű vesszőre (,).

Ennél sokkal hatékonyabb és célravezetőbb, hogy ha a Vezérlőpultban a területi beállításoknál módosítjuk az alapértelmezett értékeket.
  • Start | Vezérlőpult | Regional and Language Options
  • Additional Settings
  • Decimal Symbol legyen pont (.)
  • List Separator legyen vessző (,)
A beállításhoz tartozó ablakok

Ezt követően az EXCEL fel fogja ismerni, hogy ha pontosvesszővel vannak tagolva a CSV fájlban az értékek, valamint exportáláskor automatikusan pontosvesszővel fogja elválasztani az adatokat.