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:
Wydaje się, że istnieje problem z objawami podobne, ale nie prawdziwa przyczyna. Gdyby ktoś mógł to rozwinąć, byłbym wdzięczny!
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! –
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 $". –