Diferencia entre CurrentCulture, InvariantCulture, CurrentUICulture y InstalledUICulture
¿Cuál es la diferencia entre CurrentCulture
, InvariantCulture
, CurrentUICulture
y InstalledUICulture
de System.Globalization.CultureInfo
?
2 answers
Trataría de dar una respuesta un poco más perspicaz que esta.
CurrentCulture debe usarse para formatear. Es decir, los Números, Monedas, Porcentajes, Fechas y Horas deben siempre ser formateados con esta cultura antes de mostrarlos al usuario. Algunos ejemplos aquí:
const string CURRENCY_FORMAT = "c";
const string PERCENTAGE_FORMAT = "p";
DateTime now = DateTime.UtcNow; // all dates should be kept in UTC internally
// convert time to local and format appropriately for end user
dateLabel.Text = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);
float someFloat = 12.3456f;
// yields 12,3456 for pl-PL Culture
floatLabel.Text = someFloat.ToString(CultureInfo.CurrentCulture);
// yields 12,35 zł for pl-PL Culture - rounding takes place!
currencyLabel.Text = someFloat.ToString(CURRENCY_FORMAT, CultureInfo.CurrentCulture);
// yields 1234,56% for pl-PL Culture - 1.0f is 100%
percentageLabel.Text = someFloat.ToString(PERCENTAGE_FORMAT, CultureInfo.CurrentCulture);
Una cosa importante a tener en cuenta es que nunca debe usar float
ni double
para almacenar información relacionada con la moneda en primer lugar (decimal
es el elección correcta).
El otro caso de uso común para CurrentCulture
es el análisis basado en la configuración regional. Su aplicación debe siempre permitir a los usuarios proporcionar información en su formato regional:
float parsedFloat;
if (float.TryParse(inputBox.Text, NumberStyles.Float, CultureInfo.CurrentCulture, out parsedFloat))
{
MessageBox.Show(parsedFloat.ToString(CultureInfo.CurrentCulture), "Success at last!");
}
Tenga en cuenta que siempre proporciono el parámetro IFormatProvider
, aunque está implícito y se asume que es CultureInfo.CurrentCulture
. La razón es que quiero comunicarme con otros desarrolladores: esto es algo que se mostrará a los usuarios finales. Esta es una de las razones por las que FxCop trata de omitir este parámetro como error.
InvariantCulture por otro lado, debe usarse para convertir de manera confiable una de las clases mencionadas anteriormente a su representación textual. Así que si quieres, por ejemplo, transmitir DateTime
, float
, double
u objeto similar a través de la red, almacenarlo en una base de datos o algún tipo de archivo de texto (incluido XML), debe siempre usar InvariantCulture
:
float someFloat = 1234.56f;
// yields 1234.56
string internalFloat = someFloat.ToString(CultureInfo.InvariantCulture);
DateTime now = DateTime.UtcNow;
// yields something like 04/16/2011 19:02:46
string internalDateAndTime = now.ToString(CultureInfo.InvariantCulture);
Una cosa a tener en cuenta aquí es que el formato de fecha/hora ofrecido por InvariantCulture
es en realidad exactamente el mismo que en-US. Aunque es confiable, no es exactamente correcto. Lo que realmente se debe usar es Formato intercambiable de Fecha y Hora ISO8601 . Por alguna razón Microsoft ni siquiera proporciona tal patrón (los más cercanos son patrón clasificable - " s "y Patrón Universal - "u" que solo se asemeja al formato ISO8601), necesitaría crear el suyo propio de esta manera:
const string iso8601Pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
string iso8601Formatted = now.ToString(iso8601Pattern);
Nota al margen bastante importante: IFormatProvider
es en realidad requerido aquí ya que omitir este parámetro puede resultar en graves error. Una vez tuve que arreglar un defecto en el sistema operativo francés. El código era así:
float dbVersion = // some kind of logic that took float from database string versionString = dbVersion.ToString(); // culture-aware formatting used Version ver = new Version(versionString); // exception thrown here
La razón era muy simple: el formato float en el sistema operativo francés (con formato regional francés) fue formateado a algo así como 10,5 y Version
la clase requiere una entrada invariante de Cultura.
CurrentUICulture es responsable de cargar los recursos traducibles apropiados para su aplicación. Es decir, debe usarse para mostrar mensajes de texto, colores e imágenes correctos.
En Asp.Net aplicación si por alguna razón desea implementar el Mecanismo de Localización CSS (capacidad para anular las definiciones CSS por idioma), CurrentUICulture
es un buen camino a seguir (siempre que realmente lea esta propiedad desde el navegador web).
Del mismo modo, si desea implementar el mecanismo de cambio de idioma, CurrentUICulture
es el que debe ser anulado.
InstalledUICulture está conectado a la configuración regional predeterminada de la interfaz de usuario del sistema operativo. Como MSDN dice:
Esta propiedad es el equivalente de GetSystemDefaultUILanguage en la API de Windows.
Para entender realmente qué es esta propiedad, necesitamos profundizar en alguna teoría. Hay diferentes líneas de productos de Windows:
- un solo idioma (es decir, Inglés, Francés, Alemán, Japonés, etc.)
- MUI (es decir, Interfaz de usuario multilingüe - Sistema operativo base en inglés y Paquetes de idiomas)
Para las líneas de productos de un solo idioma, InstalledUICulture siempre devolverá el Sistema operativo idioma, mientras que para MUI siempre debe devolver inglés (Estados Unidos) aka en-US. Es útil? No lo sé, nunca necesité tal información. Y personalmente no he visto un programa que se aprovechara de esta propiedad.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:24
Tomado de esta respuesta:
CurrentCulture es la representación. NET de la configuración regional predeterminada del usuario del sistema. Esto controla el formato predeterminado de números y fechas y algo así.
CurrentUICulture se refiere al lenguaje de interfaz de usuario predeterminado, un configuración introducida en Windows 2000. Esto se refiere principalmente a la interfaz de usuario localización / traducción parte de su aplicación.
Cualquier opción regional que el sistema esté configurado para tener será la Valores "actuales" en su aplicación.NET.
Muchas veces ambos son iguales. Pero en mi sistema estarían diferente: Prefiero mis números y fechas en el formato alemán, por lo que el CurrentCulture sería alemán, pero también prefiero todas mis aplicaciones en inglés, por lo que la CurrentUICulture sería inglés.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:50