2010-04-27 6 views
11

Sviluppiamo un software consolidato che funziona bene su tutti i computer noti tranne uno. Il problema è analizzare le stringhe che iniziano con "8". Sembra che "8" all'inizio di una stringa sia un carattere riservato.int.Parse di "8" non riesce. int.Parse richiede sempre 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 

Il problema viene risolto utilizzando int.Parse ("8", CultureInfo.InvariantCulture). Tuttavia, sarebbe bello conoscere la fonte del problema.

Domanda: Perché si ottiene questo comportamento di "8" se non si specifica la cultura invariante?


Ulteriori informazioni:

ho fatto inviare un piccolo programma per il mio cliente ottenere il risultato di cui sopra:

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; 
    } 

Aggiornamento

mi sono imbattuto questo link, un bug nel database di connessione di Microsoft:

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

Sembra che ci sia un problema con i sintomi la classica, ma nessuna vera causa principale. Se qualcuno potesse approfondire questo sarei grato!

risposta

21

Per la coltura sv-SE8 rappresenta CurrencyNegativePattern ed è per questo che stai ricevendo l'errore che descrivi.

È possibile controllare questo eseguendo il seguente esempio:

var ci = new CultureInfo("sv-SE"); 

var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); 

Console.WriteLine(nfi.CurrencyNegativePattern); 
Console.WriteLine(nfi.CurrencyPositivePattern); 

Questo stamperà:

Si può esplicitamente dire che si sta parsing di un intero e non una valuta utilizzando la Parse sovraccarico che accetta l'enumerazione NumberStyles.

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

Questa volta da quando si specifica che si sta analizzando un numero intero si verificherà alcun errore.


Tuttavia, IIRC il Int32.Parse dovrebbe interpretare l'ingresso come un numero intero di default, quindi perché che stai ricevendo per l'errore con codice di esempio che è oltre me.


Aggiornamento:

Dalle informazioni di recente aggiunto sembra che si dovrebbe fare in modo che il problema non è esterno.Questo è, se l'utente, ad esempio, ha modificato l'impostazione del segno positivo delle impostazioni internazionali di Windows su 8, sarebbe normale e ha perfettamente senso per ottenere l'errore che si sta ottenendo. Sarebbe proprio come l'impostazione della + come il segno positivo e poi cercando di analizzarlo:

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

nfi.PositiveSign = "+"; 

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

chiedere all'utente per la sua impostazioni internazionali del Registro di sistema come indicato nel numero di collegamento e verificare che essi sono ciò che ci si aspetterebbe.

Nota a margine: benvenuto in SO e, a proposito, la prossima volta che devi aggiungere ulteriori informazioni alla tua domanda, devi modificarla invece di fornirla in una risposta.

+0

Grazie per la nota a margine, mi sono preso cura di esso :) Ho controllato in precedenza i valori nel Registro di sistema per le sue impostazioni internazionali e l'unico 8 fuori c'è il CurrencyNegativePattern che non mi aiuta a riprodurre l'errore sulla mia macchina. Sei decisamente sulla pista giusta qui João. Tuttavia, questo problema è difficile e non sono sicuro che Microsoft conosca il motivo del problema. Sicuramente stai ottenendo un grande successo, ma il comportamento è ancora un mistero. Ecco perché non accetto la tua risposta come soluzione, anche se sono grato per il tuo impegno! –

+3

L'inizio di questa risposta mi sembra sbagliato. I valori in 'NumberFormatInfo.CurrencyNegativePattern' e' NumberFormatInfo.CurrencyPositivePattern' sono utilizzati solo come chiavi - per identificare l'ordine del segno negativo (-), il simbolo di valuta e il numero stesso che verrà utilizzato per la formattazione/analisi. Ad esempio, "8" come valore di "CurrencyNegativePattern" significa che il modello deve essere "-n $". –

Problemi correlati