Tengo una cadena de texto así:
var foo = "FooBar";
Quiero declarar una segunda cadena llamada bar
y hacer que sea igual al primer y cuarto carácter de mi primero foo
, así que hago esto así:
var bar = foo[0].ToString() + foo[3].ToString();
Esto funciona como se esperaba, pero ReSharper me aconseja poner Culture.InvariantCulture
dentro de mis corchetes, por lo que esta línea termina así:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
¿Qué significa esto y afectará la forma en que se ejecuta mi programa?
Respuestas:
No todas las culturas usan el mismo formato para fechas y valores decimales / monetarios.
Esto tendrá importancia para usted cuando usted está convirtiendo valores de entrada (leer) que se almacenan como cadenas a
DateTime
,float
,double
odecimal
. También será importante si intenta formatear los tipos de datos mencionados anteriormente en cadenas (escritura) para su visualización o almacenamiento.Si sabe en qué cultura específica estarán sus fechas y valores decimales / monetarios antes de tiempo, puede usar esa
CultureInfo
propiedad específica (es decirCultureInfo("en-GB")
). Por ejemplo, si espera una entrada del usuario.La
CultureInfo.InvariantCulture
propiedad se utiliza si está formateando o analizando una cadena que debería ser analizable por un software independiente de la configuración local del usuario.El valor predeterminado es
CultureInfo.InstalledUICulture
por lo que CultureInfo predeterminado depende de la configuración del SO en ejecución. Es por eso que siempre debe asegurarse de que la información cultural se ajuste a su intención (consulte la respuesta de Martin para obtener una buena guía).fuente
en-US
. Es la cultura local. YInvariantCulture
se usa cuando desea un formato cultural neutral que sea independiente del sistema local. Por ejemplo, cuando se trabaja con formatos de archivo basados en texto.Cuando los números, las fechas y las horas se formatean en cadenas o se analizan a partir de cadenas, se utiliza una cultura para determinar cómo se hace. Por ejemplo, en la
en-US
cultura dominante tienes estas representaciones de cuerdas:En mi cultura (
da-DK
) los valores tienen esta representación de cadena:En el sistema operativo Windows, el usuario puede incluso personalizar cómo se formatean los números y las fechas / horas y también puede elegir otra cultura que no sea la cultura de su sistema operativo. El formato utilizado es la elección del usuario, que es cómo debe ser.
Así que cuando se formatea un valor que se muestra al usuario el uso de, por ejemplo,
ToString
oString.Format
o analizada desde una cadena usandoDateTime.Parse
oDecimal.Parse
el valor por defecto es usar elCultureInfo.CurrentCulture
. Esto permite al usuario controlar el formateo.Sin embargo, una gran cantidad de formato de cadenas y análisis no son cadenas intercambiadas entre la aplicación y el usuario, sino entre la aplicación y algún formato de datos (por ejemplo, un archivo XML o CSV). En ese caso, no desea usarlo
CultureInfo.CurrentCulture
porque si se formatea y analiza con diferentes culturas, puede romperse. En ese caso, desea utilizarCultureInfo.InvariantCulture
(que se basa en laen-US
cultura). Esto asegura que los valores pueden ser de ida y vuelta sin problemas.La razón de que ReSharper le da la advertencia es que algunos programadores de aplicaciones no son conscientes de esta distinción que puede conducir a resultados no deseados pero nunca descubren esto porque sus
CultureInfo.CurrentCulture
es deciren-US
, que tiene el mismo comportamiento queCultureInfo.InvariantCulture
. Sin embargo, tan pronto como la aplicación se use en otra cultura donde existe la posibilidad de usar una cultura para formatear y otra para analizar, la aplicación puede romperse.Para resumirlo:
CultureInfo.CurrentCulture
(el valor predeterminado) si está formateando o analizando una cadena de usuario.CultureInfo.InvariantCulture
si está formateando o analizando una cadena que debería ser analizable por una pieza de software.fuente
Decimal
variable que contiene un cierto valor en dólares estadounidenses, ¿me gustaría hacer una excepción y usarlaen-US
como cultura al mostrarla para asegurarme de que no obtengo un resultado que se parece a un número en euros? Lo intentéCultureInfo.InvariantCulture
, pero obtuve esto para el marcador de moneda¤
, así que no estoy seguro de que sea la forma correcta.CultureInfo.CurrentCulture
). Si además de mostrar un número necesita la moneda, entonces quizás debería hacerlo de manera consistente, es decir, sin usarCultureInfo
ay, en su lugar, use el código de moneda de tres letras comoUSD 1,234.56
. Entonces no te metes en los problemas de asignar una moneda a una cultura.De acuerdo con Microsoft:
(de http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )
Entonces InvariantCulture es similar a la cultura "en-US" pero no exactamente igual. Si tú escribes:
entonces s1 y s2 tendrán un formato similar pero InvariantCulture agrega ceros a la izquierda y "en-US" usa AM o PM.
Entonces InvariantCulture es mejor para uso interno, cuando, por ejemplo, guarda una fecha en un archivo de texto o analiza datos. Y un CultureInfo especificado es mejor cuando presenta datos (fecha, moneda ...) al usuario final.
fuente
Para cosas como números (puntos decimales, comas en cantidades), generalmente se prefieren en la cultura específica.
Una forma adecuada de hacerlo sería establecerlo en el nivel de cultura (para alemán) de esta manera:
fuente
JetBrains ofrece una explicación razonable ,
pero si estoy trabajando en un sitio que sé que solo estará en inglés, simplemente ignoro la sugerencia.
fuente