2010-04-27 7 views
11

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.int.Parse de "8" falla. int.Parse siempre requiere CultureInfo.InvariantCulture?

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 utilizando int.Parse ("8", CultureInfo.InvariantCulture). Sin embargo, sería bueno saber el origen del problema.

Pregunta: ¿Por qué tenemos este comportamiento de "8", si no se especifica cultural de todos?


Información adicional:

envié un pequeño programa para mi cliente 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; 
    } 

actualización

me encontré con este enlace, un error en la base de datos de conexión de Microsoft:

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 ninguna causa raíz real. ¡Si alguien pudiera dar más detalles sobre esto, estaría agradecido!

Respuesta

21

Para la cultura sv-SE8 representa CurrencyNegativePattern y es por eso que obtiene el error que describe.

Puede comprobarlo 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); 

Esta es la salida:

Se puede decir explícitamente que se está analizando un número entero y no una moneda utilizando el Parse sobrecarga que acepta una enumeración NumberStyles.

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

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


Sin embargo, el IIRC Int32.Parse debe interpretar la entrada como un entero por defecto, así que por qué recibe al error con el código de ejemplo que está más allá de mí.


Actualización:

De la información que ha agregado recientemente parece que usted debe asegurarse de que el problema no es externo.Es decir, si el usuario, por ejemplo, cambiara la configuración del signo positivo de la configuración regional de Windows al 8, sería normal y tendría mucho sentido que usted obtenga el error que está obteniendo. Sería igual que el establecimiento de la + como el signo positivo y luego tratar de analizarlo:

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

nfi.PositiveSign = "+"; 

Int32.Parse("+", nfi); // This will throw 

preguntar al usuario por su configuración del registro de localización como se indica en el tema Conectar y comprobar que son lo que cabría esperar.

Nota al margen: 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.

+0

Gracias por la nota al margen, me ocupé :) He comprobado anteriormente los valores en el registro para su configuración de configuración regional y el único 8 por ahí es el CurrencyNegativePattern que no me ayuda a reproducir el error en mi máquina. Definitivamente está en la dirección correcta aquí João. Sin embargo, este problema es difícil y tampoco estoy seguro de que Microsoft sepa el motivo del problema. Seguramente obtendrá una gran UP, pero el comportamiento sigue siendo un misterio. ¡Es por eso que no acepto que tu respuesta sea una solución, aunque estoy agradecido por tu esfuerzo! –

+3

El comienzo de esta respuesta me parece incorrecto. Los valores en 'NumberFormatInfo.CurrencyNegativePattern' y' NumberFormatInfo.CurrencyPositivePattern' se usan solo como claves: para identificar el orden del signo negativo (-), el signo de moneda y el número mismo que se usará para formatear/analizar. Por ejemplo, '8' como valor de 'CurrencyNegativePattern' significa que el patrón debe ser '-n $'. –

Cuestiones relacionadas