MadMyche
Чтение документации и образцов MS...
Преобразование Класса (Системы) | Microsoft Docs[^]
Formatexception версия
Это происходит, когда попытка преобразовать строковое значение в любой другой базовый тип завершается неудачей из-за того, что строка находится не в правильном формате. Исключение создается для следующих преобразований:
1. Строка преобразуется в логическое значение не равно логическое.TrueString или Boolean.Фальстринг.
2. Строка преобразуется в значение типа char состоит из нескольких символов.
3. Строка, подлежащая преобразованию в любой числовой тип, не распознается как допустимое число
А если мы посмотрим на код блокировки вверх по странице, то для попытки преобразования в Int
int newInteger = 0;
try {
System.Console.WriteLine("Enter an integer:");
newInteger = System.Convert.ToInt32(System.Console.ReadLine());
}
//catch (System.ArgumentNullException) { ... }
catch (System.FormatException) {
System.Console.WriteLine(
"String does not consist of an optional sign followed by a series of digits."
);
}
//catch (System.OverflowException) {... }
"Строка не состоит из необязательного знака, за которым следует ряд цифр."
Казалось бы, единственное, что может начать число, - это либо знак (положительный или отрицательный), либо число.
Значения, которые вы указали в своем вопросе, начинались с десятичной точки, и, возможно, именно поэтому вы терпите неудачу.
Согласно нескольким ресурсам, правильная нотация для десятичного значения меньше 1 должна начинаться с "0" перед десятичной точкой. Я никогда об этом не задумывался.
Числа - Десятичные Числа - В Глубину[
^]
Написание десятичного числа меньше 1 с учетом его названия - Tutorialspoint[
^]
Теперь, когда мы все это знаем... что же мне делать?
Как говорится в другом ответе, вы можете попробовать использовать
TryParse
метод
decimal d = 0;
if (!Decimal.TryParse(dataGridView1.Rows[i].Cells[31].Value, out d) {
// Parsing failed !
// handle appropriately
}
Десятичный.Метод TryParse (Система) | Microsoft Docs[
^]
Другой вариант-сначала проверить строку, чтобы увидеть, является ли первый символ десятичной точкой; и если да, то добавьте к нему "0"
//decimal d = Convert.ToDecimal(dataGridView1.Rows[i].Cells[31].Value);
string Cell31 = dataGridView1.Rows[i].Cells[31].Value;
if (Cell31.Substring(0,1) == ".") { Cell31 = "0" + Cell31; }
decimal d = Convert.ToDecimal(Cell31);