Witam,
Nie mogąc doszukać się, czy istnieje funkcja która pozwala maksymalnie ograniczyć użytkownika we wprowadzaniu danych w konsoli (w celu zwiększenia idiotoodporności) napisałem własną. Początkowo była ona w C++ i wszystko było ok, ale musiałem mój program przepisać na C# i teraz dostaję FormatException z wiadomością "Input string was not in a correct format" gdy na przykład wpisuję "0.222".
Kod metody:
[DllImport("msvcrt")]
static extern int _getch();
//(...)
private static double GetValue(bool getDouble) //pobiera zmienna int lub double od uzytkownika - +1 do idiotoodpornosci
{
string temp = "";
int znak;
int z = 0;
int dots = 0;
do
{
if (z == 9) //limit znakow
{
znak = _getch();
if (znak == 8) //bksp
{
z--;
Console.Write("\b \b");
if (getDouble && temp[z] == 46)
dots--;
temp = temp.Remove(temp.Length - 1, 1);
}
}
else
{
znak = _getch();
if ((z > 0) && (znak == 8))
{
z--;
Console.Write("\b \b");
if (getDouble && temp[z] == 46)
dots--;
temp = temp.Remove(temp.Length - 1, 1);
}
if (getDouble)
{
if ((znak >= 48) && (znak <= 57) || (znak == 46 && dots == 0))
{
if (znak == 46)
dots++;
temp += (char)znak;
Console.Write((char)znak);
z++;
}
}
else
{
if ((znak >= 48) && (znak <= 57))
{
temp += (char)znak;
Console.Write((char)znak);
z++;
}
}
}
} while (znak != '\r'); //enter
double result = double.Parse(temp); //tu wystepuje wyjatek
if (result > 0)
return result;
return -1;
}
Zauważyłem, że problemem jest podawanie kropki a nie przecinka. Czy można gdzieś ustawić, że akceptowana i wyświetlana w powiązaniu z double ma być kropka a nie przecinek?
Jeszcze jedno pytanie przy okazji, w C++ setprecision określał liczbę miejsc po przecinku, ale w razie mniejszej liczby miejsc znaczących w danej zmiennej kończył wraz z nimi, natomiast teraz jak używam:
String.Format("{0:F6}", costam)
To nawet jak zmienna została podana jak całkowita (150,0), to wyświetla niepotrzebne zera po przecinku. Jak to obejść?
Pozdrawiam.
P.S. Pytanie pierwsze jest trochę "pro forma", bo nie ma znaczenia czy to będzie przecinek czy kropka. Zdziwiło mnie tylko, że wbrew moim domysłom na temat stosowania kropki i przecinka tak jest.