thread spanish example espaƱol current brasil c# .net parsing cultureinfo currentculture

spanish - set cultureinfo c#



int.Parse de "8" falla. int.Parse siempre requiere CultureInfo.InvariantCulture? (1)

Para la cultura sv-SE , 8 representa CurrencyNegativePattern y es por eso que está obteniendo el error que describe.

Puede verificar esto ejecutando el siguiente ejemplo:

var ci = new CultureInfo("sv-SE"); var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); Console.WriteLine(nfi.CurrencyNegativePattern); Console.WriteLine(nfi.CurrencyPositivePattern);

Esto dará como resultado:

// 8 // 3

Puede decir explícitamente que está analizando un entero y no una moneda mediante el uso de la sobrecarga de Parse que acepta una enumeración NumberStyles .

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE"));

Esta vez, dado que está especificando que está analizando un entero, no se producirá ningún error.

Sin embargo, IIRC Int32.Parse debe interpretar la entrada como un entero de manera predeterminada, por lo tanto, ¿por qué está llegando al error con ese código de muestra?

Actualizar:

A partir de la información que agregó recientemente, parece que debe asegurarse de que el problema no sea externo. Esto es, si el usuario, por ejemplo, cambiara la configuración del signo positivo de la configuración regional de Windows a 8 , sería normal y tiene mucho sentido que obtenga el error que está obteniendo. Sería como establecer el + como el signo positivo y luego intentar analizarlo:

var ci = new CultureInfo("sv-SE"); var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); nfi.PositiveSign = "+"; Int32.Parse("+", nfi); // This will throw

Pregúntele al usuario por su configuración de registro regional como se indica en el problema de Connect y verifique que sea lo que usted esperaría.

Nota al pie: Bienvenido a SO y, por cierto, la próxima vez que necesite agregar más información a su pregunta, debe editarla en lugar de proporcionarla en una respuesta.

Desarrollamos un software establecido que funciona bien en todas las computadoras conocidas excepto en una. El problema es analizar cadenas que comienzan con "8". Parece que "8" en el comienzo de una cadena es un carácter reservado.

Parsing: int.Parse("8") -> Exception message: Input string was not in a correct format. int.Parse("80") -> 0 int.Parse("88") -> 8 int.Parse("8100") -> 100 CurrentCulture: sv-SE CurrentUICulture: en-US

El problema se resuelve usando int.Parse ("8", CultureInfo.InvariantCulture) . Sin embargo, sería bueno saber el origen del problema.

Pregunta: ¿Por qué obtenemos este comportamiento de "8" si no especificamos cultura invariante?

Información Adicional:

Le envié un pequeño programa a mi cliente para lograr el resultado anterior:

private int ParseInt(string s) { int parsedInt = -1000; try { parsedInt = int.Parse(s); textBoxMessage.Text = "Success: " + parsedInt; } catch (Exception ex) { textBoxMessage.Text = string.Format("Error parsing string: ''{0}''", s) + Environment.NewLine + "Exception message: " + ex.Message; } textBoxMessage.Text += Environment.NewLine + Environment.NewLine + "CurrentCulture: " + Thread.CurrentThread.CurrentCulture.Name + "/r/n" + "CurrentUICulture: " + Thread.CurrentThread.CurrentUICulture.Name + "/r/n"; return parsedInt; }

Actualizar

Me encontré con este enlace, un error en la base de datos de microsoft connect:

https://connect.microsoft.com/VisualStudio/feedback/details/253265/int32-parse-fails-to-convert-the-string-0-zero-on-some-systems

Parece que hay un problema con síntomas similares, pero no hay una causa real. ¡Si alguien pudiera dar más detalles sobre esto, estaría agradecido!