long - string parse c#
Cultura invariante Decimal.TryParse() (4)
No puedo averiguar qué usar como el tercer parámetro.
Porque todas las culturas NumberDecimalSeparator
o NumberGroupSeparator
etc. no son lo mismo.
Alguien usa .
como NumberDecimalSeparator
, alguien lo usa ,
pero no hay CultureInfo
que use ambos como NumberDecimalSeparator
.
CultureInfo
implementa la interfaz IFormatProvider
. Es por eso que si especifica su CultureInfo
, su cadena de value
intenta ser analizada en esas reglas de culturas.
Estoy escribiendo una cadena personalizada al validador decimal que necesita usar Decimal.TryParse que ignora la cultura
En tal caso, puede usar el método CultureInfo.Clone
para copiar la cultura que desea (o InvariantCulture
) y puede establecer NumberDecimalSeparator y NumberGroupSeparator qué cadena desea.
Estoy escribiendo una cadena personalizada al validador decimal que necesita usar Decimal.TryParse que ignora la cultura (es decir, no importa si la entrada contiene "." O "," como separador de punto decimal). Este es el método sugerido:
public static bool TryParse(
string s,
NumberStyles style,
IFormatProvider provider,
out decimal result
)
No puedo averiguar qué usar como el tercer parámetro. Los ejemplos que he visto se ven así:
culture = CultureInfo.CreateSpecificCulture("en-GB");
Decimal.TryParse(value, style, culture, out number)
Por eso crean una cultura específica. CultureInfo no tiene un método "CreateInvariantCulture", y CultureInfo.InvariantCulture no es del tipo requerido. ¿Cuál es el uso correcto?
De hecho, CultureInfo.InvariantCulture
se puede utilizar aquí. El parámetro espera IFormatProvider
, una interfaz que implementa CultureInfo
. Pero InvariantCulture
es invariante en el sentido de que no varía con la configuración del usuario.
De hecho, no hay cultura que acepte ,
o .
como separador decimal - todos son uno u otro. Tendrá que encontrar otra forma de tratar los datos que pueden usar cualquiera de estos separadores decimales.
Han intentado así:
decimal value;
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value);
La mejor manera sería utilizar el método Decimal.Parse () como lo haría tradicionalmente con cualquier valor de cadena decimal.
Puede usar NumberStyles.Currency para especificar que los valores se lean como moneda, lo que se hará cargo de cualquier valor relacionado con la moneda (deberá agregar una Referencia a System.Globalalization para usar esto:
using System.Globalization;
Decimal.Parse también acepta un tercer parámetro, que le permitirá establecer explícitamente el IFormatProvider
si así lo desea y le desea una Cultura específica:
decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55
Mis chicos malos He probado el siguiente código:
string DutchDecimal = "1,5";
string EnglishDecimal = "1.5";
decimal a;
decimal b;
Console.WriteLine(decimal.TryParse(DutchDecimal, out a));
Console.WriteLine(a);
Console.WriteLine(decimal.TryParse(EnglishDecimal, out b));
Console.WriteLine(b);
Console.Read();
y analiza correctamente ambas cadenas. Parece que el TryParse predeterminado es, de hecho, invariable para la cultura. Supuse que este no era el caso, porque el TypeConversionValidator predeterminado en EnterpriseLibrary dependía de la cultura y asumí que simplemente usaba TryParse. Sin embargo, resulta que este analizador por defecto está codificado para usar la cultura actual.
EDITAR: Me enteré de que "1.5" se convierte en 1.5 y "1.5" se convierte en 15. Esto es realmente correcto para el comportamiento invariable de la cultura, así que ahí está. Toda esta pregunta fue aparentemente generada por mi incomprensión de cómo funciona la invariable cultura.