Występuje dziwne zachowanie podczas przekształcania liczby w liczbę podwójną podczas korzystania z informacji o kulturze.
Konwersja "3,3"
przy użyciu kultury holenderskiej jest obsługiwana poprawnie. Jeśli skonwertuję "3,3"
przy użyciu kultury amerykańskiej, zwróci ona 33
. Spodziewałem się błędu. Zobacz mój przykład:Liczba z separatorem dziesiętnym niepoprawnie rzutowana na podwójnie
static void Main(string[] args)
{
CultureInfo cultureDutch = new CultureInfo("nl-NL");
CultureInfo cultureUS = new CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = cultureDutch;
Console.WriteLine("Input 3,3 --> Expected 3,3");
Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureDutch));
// Actual result --> 3,3
Console.WriteLine("Input 3,3 --> Expected InvalidCastException");
Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureUS));
// Actual result --> 33
Console.WriteLine();
Console.WriteLine();
System.Threading.Thread.CurrentThread.CurrentCulture = cultureUS;
Console.WriteLine("Input 3.3 --> Expected InvalidCastException");
Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureDutch));
// Actual result --> 33
Console.WriteLine("Input 3.3 --> Expected 3.3");
Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureUS));
// Actual result --> 3.3
Console.ReadLine();
}
Jaki jest prawidłowy sposób obsługi tego? Wolałbym wyjątek, gdy separator dziesiętny (lub tysiąc) jest nieprawidłowy.
Przecinek jest separatorem tysięcy, .NET nie jest wrażliwy na to, gdzie użytkownik je umieszcza. Albo, że użytkownik ma nieregularny wzór, tak jak Indianie. Musisz dążyć do prawdziwej poprawki i wiedzieć, jakiego języka mówi użytkownik. To nigdy nie jest prawdziwy problem, to wątek.CurrentCulture. Problem występuje tylko wtedy, gdy mówisz po holendersku i udajesz, że nie jesteś z Holandii, nie informując o tym swojego systemu operacyjnego. –