This article is currently in the process of being translated into Spanish (~99% done).
The RegionInfo class
En el artículo previo sobre la clase CultureInfo, discutimos la parte de país/reion un poco, pero en realidad podemos hacer más cosas basadas en región con una de las otras clases en el espacio de nombre System.Globalization: La clase RegionInfo. Contendrá mucha información útil acerca de la región específica (usualmente un país), por ejemplo, el nombre y el símbolo de la moneda, si usan sistema métrico o no, además de otra.
Obteniendo una instancia de RegionInfo
Para acceder a la información regional, necestia una instancia de la clase RegionInfo. Tiene un constructor el cual un código ISO 3166 o el código del lenguaje/país-región de la región (por ejemplo "en-US"). Aquí está un ejemplo:
RegionInfo regionInfo = new RegionInfo("en-US");
Console.WriteLine(regionInfo.EnglishName);
Esto significa que si ya tiene una referencia a una clase CultureInfo, puede fácilmente usar esta para asegurarse que obteniene la RegionInfo que empate. Y como aprendimos en un artículo previo, su aplicación siempre tiene una instancia CultureInfo en las espaldas que usted puede referenciar:
RegionInfo regionInfo = new RegionInfo(CultureInfo.CurrentCulture.Name);
Console.WriteLine(regionInfo.EnglishName);
Dicho ésto, echémos un vistazo a algunas de las características útiles de la clase RegionInfo.
Propiedades importantes de la clase RegionInfo
Ya revismos la propiedad EnglishName - simplemente devuelve el nombre de la región, en Inglés, Pero por supuesti hay más cosas allí - para ejemplo varias propiedades relacionadas a la moneda:
RegionInfo regionInfo = new RegionInfo("sv-SE");
Console.WriteLine(regionInfo.CurrencySymbol);
Console.WriteLine(regionInfo.ISOCurrencySymbol);
Console.WriteLine(regionInfo.CurrencyEnglishName);
Console.WriteLine(regionInfo.CurrencyNativeName);
Usando CurrencySymbol, ISOCurrencySymbol, CurrencyEnglishName y/o CurrencyNativeName, obtenemos la información que necesitamos para desplegar mensajes relacionados a la moneda. El resultado se verá como esto (en el caso de Sueco/Suecia):
kr
SEK
Swedish Krona
Svensk krona
También puede verificar fácilmente si la región dada usa el sistema métrico, usando la propiedad IsMetric:
RegionInfo regionInfo = new RegionInfo(CultureInfo.CurrentCulture.Name);
Console.WriteLine("Is the metric system used in " + regionInfo.EnglishName + "? " + (regionInfo.IsMetric ? "Yes" : "No"));
Eso nos deja con todas las propiedades relacionadas con identidad:
- Name le dará el código ISO 3166 que identifica al lenguaje y país/región , por ejemplo, "en-US" para Inglés/Estados Unidos.
- DisplayName le dará el nombre completo del país/región en la versión local del ambiente .NET.
- EnglishName le dará el nombre completo del país/región en Inglés.
- NativeName le dará el nombre completo del país/región en el lenguaje dado, por ejemplo "United States" para en-US o "Deutschland" para de-DE.
- TwoLetterISORegionName le dará el código de dos letras ISO 3166 para el país/región, por ejemplo, "US" para los Estados Unidos o "DE" para Alemania.
- ThreeLetterISORegionName le darpa el código de tres letras ISO 3166 para el país/región, por ejemplo, "USA" para los Estados Unidos o "DEU" para Alemania.
Obviamente, estas propiedades vendrán bien a la mano cuando tenga que desplegar información acerca de un país/región, como lo veremos en nuestro siguiente ejemplo.
Obteniendo una lista de países con RegionInfo
En el artículo previo, le mostré como obtener una lista de todos las culturas definidas en el ambiente .NET, lo cual básicamente nos deja con una lista de combinaciones de lenguaje-país/región. Podemos usar eso en combinación con la clase RegionInfo para obtener una lista de países/regiones:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace RegionInfoCountries
{
class Program
{
static void Main(string[] args)
{
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
List<RegionInfo> countries = new List<RegionInfo>();
foreach (CultureInfo ci in cultures)
{
RegionInfo regionInfo = new RegionInfo(ci.Name);
if (countries.Count(x => x.EnglishName == regionInfo.EnglishName) <= 0)
countries.Add(regionInfo);
}
foreach (RegionInfo regionInfo in countries.OrderBy(x => x.EnglishName))
Console.WriteLine(regionInfo.EnglishName);
}
}
}
Así, este ejemplo es un poco más extenso que los otros ejemplos en este artículo, pero permítame desmenuzarlo para usted. Empezamos por obtener una lista de todas las culturas específicas disponibles - como aprendimos en el artículo previo, las culturas específicas son las que definen un lenguaje y un país/región. Iteramos através de la lista y en cada iteración, usamos la instancia de CultureInfo para crear una instancia correspondiente RegionInfo. Verificamos si un país con ese nombre ya ha sido agregado a la lista y si no lo ha sido, lo agregamos. Cuando la iteración ha terminado, tenemos una lista completa de los países definidos en el ambiente .NET, lo cual podemos iterar y desplegar en la consola, o hacer casí cualquier cosa que pudieramos encontrar útil.
Este es un buen ejemplo de lo que puede lograr con la combinación de CultureInfo y RegionInfo, pero permítame enfatizar que esto no es una lista completa y precisa de países. Es en cambio una lista completa de países definidos en la versión del ambiente .NET que está usando, básicamente significa que algunos países pueden ser omitidos o pueden haber cambiado de nombre desde que la versión liberada. Entonces, si necesita una lista de países 100 % precisa y actualizada, probablemente tendrá que crearla y mantenerla usted mismo.
Resumen
La clase RegionInfo es básicamente una extensión de la clase CultureInfo con aún más información útil acerca de un país/región específico. Le permite conocer más acerca de la identidad y la moneda de una región específica, y puede ayudarle a obtener una lista de países/regiones.