2010-04-27 13 views
11

Tworzymy sprawdzone oprogramowanie, które działa dobrze na wszystkich znanych komputerach oprócz jednego. Problem polega na analizowaniu ciągów zaczynających się od "8". Wygląda na to, że "8" na początku łańcucha jest zarezerwowaną postacią.int.Parse z "8" nie działa. int.Parse zawsze wymaga 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 

Problem ten jest rozwiązany za pomocą int.Parse ("8", CultureInfo.InvariantCulture). Jednak miło byłoby poznać źródło problemu.

Pytanie: Dlaczego otrzymujemy takie zachowanie "8", jeśli nie określamy kultury niezmienniczej?


Dodatkowe informacje:

zrobiłem wysłać mały program do mojego klienta osiągnąć wynik powyżej:

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

Aktualizacji

natknąłem ten link, to błąd w Microsoft Connect bazy danych:

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

Wydaje się, że istnieje problem z objawami podobne, ale nie prawdziwa przyczyna. Gdyby ktoś mógł to rozwinąć, byłbym wdzięczny!

Odpowiedz

21

Dla sv-SE kultura reprezentuje CurrencyNegativePattern i dlatego otrzymujesz błąd, który opisujesz.

Można to sprawdzić uruchamiając następujący przykład:

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

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

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

Wyjście to będzie:

można jednoznacznie powiedzieć, że jesteś parsowania liczbę całkowitą, a nie walutę za pomocą Parse przeciążenie, które akceptuje wyliczenie NumberStyles.

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

Tym razem, ponieważ jesteś podając, że jesteś parsowania liczbę całkowitą nie wystąpi błąd.


Jednak IIRC Int32.Parse należy interpretować jako liczbę całkowitą wejście domyślnie, więc dlaczego dostajesz do błędu z tego przykładowego kodu jest poza mną.


Aktualizacja:

Z informacji ostatnio dodanej wydaje się, że należy upewnić się, że problem nie jest zewnętrzna.To jest, jeśli użytkownik na przykład zmienił ustawienia znaku pozytywnego ustawienia narodowego Windows na 8, byłoby to normalne i miałoby sens, aby uzyskać błąd, który otrzymujesz. Byłoby tak jak ustawienie + jako pozytywny sygnał, a następnie próbuje je analizować:

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

nfi.PositiveSign = "+"; 

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

Zapytaj użytkownika o to locale ustawień rejestru jak wskazane w numerze Connect i sprawdzić, czy są to czego można oczekiwać.

Uwaga boczna: witamy w SO, a przy okazji, gdy następnym razem będziesz musiał dodać więcej informacji do swojego pytania, powinieneś je edytować zamiast podawać w odpowiedzi.

+0

Dzięki za boczną notatkę, zająłem się tym :) Sprawdziłem wcześniej wartości w rejestrze dla jego ustawień regionalnych i jedyne 8 na zewnątrz jest CurrencyNegativePattern, który nie pomaga mi odtworzyć błąd na mojej maszynie. Z pewnością jesteś na dobrej drodze tutaj João. Jednak ten problem jest trudny i nie jestem pewien, czy Microsoft zna przyczynę problemu. Na pewno masz dużą szansę, ale zachowanie to wciąż tajemnica. Dlatego nie akceptuję odpowiedzi jako rozwiązania, chociaż jestem wdzięczny za twój wysiłek! –

+3

Początek tej odpowiedzi wydaje mi się błędny. Wartości w 'NumberFormatInfo.CurrencyNegativePattern' i' NumberFormatInfo.CurrencyPositivePattern' są używane tylko jako klucze - aby zidentyfikować kolejność znaku ujemnego (-), znaku waluty i samej liczby, która będzie używana do formatowania/parsowania. Na przykład "8" jako wartość "CurrencyNegativePattern" oznacza, że ​​wzór powinien wynosić "-n $". –

Powiązane problemy