2010-04-27 9 views
11

Wir entwickeln eine etablierte Software, die auf allen bekannten Computern bis auf einen funktioniert. Das Problem besteht darin, Strings zu analysieren, die mit "8" beginnen. Es scheint, als wäre "8" am Anfang einer Zeichenfolge ein reserviertes Zeichen.Int.Parse von "8" schlägt fehl. int.Parse erfordert immer 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 

Das Problem wird gelöst, indem int.Parse ("8", CultureInfo.InvariantCulture). Es wäre jedoch schön, die Ursache des Problems zu kennen.

Frage: Warum erhalten wir dieses Verhalten von "8", wenn wir keine invariante Kultur angeben?


Zusätzliche Informationen:

ich ein kleines Programm zu meinem Klienten senden tat das Ergebnis oben erreichen:

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

aktualisieren

ich über gestolpert Link, um ein Fehler in der Microsoft Connect-Datenbank:

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

Es scheint, wie es mit ähnlichen Symptomen ein Problem ist, aber keine wirkliche Ursache. Wenn jemand das näher ausführen könnte, wäre ich dankbar!

Antwort

21

Für die sv-SE Kultur 8 stellt CurrencyNegativePattern dar und deshalb erhalten Sie den Fehler, den Sie beschreiben.

Sie können dies überprüfen, indem Sie das folgende Beispiel ausgeführt wird:

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

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

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

erhalten Sie folgende Ausgabe:

Sie können explizit sagen, dass Sie eine ganze Zahl parsen und nicht eine Währung durch die Parse mit Überlastung, die eine NumberStyles Enumeration akzeptiert.

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

Diese Zeit, seit Sie angeben, dass Sie eine Ganzzahl analysieren, wird kein Fehler auftreten.


jedoch IIRC die Int32.Parse sollte die Eingabe als eine ganze Zahl von Standard interpretieren, also warum Sie mit diesem Beispielcode zu dem Fehler immer ist mir schleierhaft.


Update:

Aus den Informationen, die Sie kürzlich hinzugefügt es scheint, dass Sie darauf achten sollten, dass das Problem nicht extern ist.Das heißt, wenn der Benutzer zum Beispiel die Einstellung für das positive Zeichen des Windows-Gebietsschemas auf 8 geändert hat, wäre das normal und es wäre vollkommen sinnvoll, wenn Sie den Fehler erhalten, den Sie erhalten. Es wäre genauso wie die + als positives Zeichen setzen und dann versuchen, es zu analysieren:

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

nfi.PositiveSign = "+"; 

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

Bitten Sie den Benutzer für sie locale Registrierungseinstellungen sind wie in der Connect-Ausgabe angezeigt und prüfen, ob sie sind, was man erwarten würde.

Seitennotiz: Willkommen zu SO und übrigens das nächste Mal, wenn Sie weitere Informationen zu Ihrer Frage hinzufügen müssen, sollten Sie es bearbeiten, anstatt es in einer Antwort bereitzustellen.

+0

Danke für die Randnotiz, ich kümmerte mich darum :) Ich habe früher die Werte in der Registrierung für seine Gebietsschema-Einstellungen überprüft und die einzige 8 da draußen ist die CurrencyNegativePattern, die mir nicht hilft, den Fehler zu reproduzieren auf meiner Maschine. Sie sind definitiv auf dem richtigen Weg hier João. Dieses Problem ist jedoch sehr schwierig und ich bin mir nicht sicher, ob Microsoft den Grund für das Problem kennt. Du wirst mit Sicherheit ein großes UP bekommen, aber das Verhalten ist immer noch ein Mysterium. Deshalb akzeptiere ich deine Antwort nicht als Lösung, obwohl ich dir für deine Mühe dankbar bin! –

+3

Der Anfang dieser Antwort scheint mir falsch. Die Werte in 'NumberFormatInfo.CurrencyNegativePattern' und' NumberFormatInfo.CurrencyPositivePattern' werden nur als Schlüssel verwendet - um die Reihenfolge von negativem Vorzeichen (-), Währungszeichen und der Zahl selbst zu bestimmen, die zum Formatieren/Parsen verwendet wird. Zum Beispiel bedeutet '8' als Wert von 'CurrencyNegativePattern', dass das Muster '-n $' sein sollte. –