Member 12349103 Ответов: 2

C# winform textbox, у меня есть текстовое поле и я хочу ввести десятичные знаки


C# winform textbox, у меня есть текстовое поле и я хочу ввести десятичные знаки, например .2 или 7.
Я продолжаю получать систему.FormatException: 'входная строка была не в правильном формате.

<pre> private void tb_Percentage_TextChanged(object sender, EventArgs e)
        {
           
            for (int i = 0; i < dataGridView1.Rows.Count; i++)

            {
                DataGridViewRow row = dataGridView1.Rows[i];
             
              decimal d = Convert.ToDecimal(dataGridView1.Rows[i].Cells[31].Value);
              //  tb_Percentage.Text = string.Format("{0:C2}", Convert.ToInt32(tb_Percentage.Text));
                decimal E = decimal.Parse(tb_Percentage.Text);
                decimal f = d * E;
                dataGridView1.Rows[i].Cells[32].Value = f.ToString("#.00");
                           
            }
        }


Что я уже пробовал:

//  tb_Percentage.Text = string.Format("{0:C2}", Convert.ToInt32(tb_Percentage.Text));


также пробовал регулярные выражения

2 Ответов

Рейтинг:
4

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


Рейтинг:
0

Tony Hill

При попытке преобразовать текст в число вам будет лучше использовать методы TryParse, так как вы можете определить, не удалось ли преобразование, и предпринять соответствующие действия.

напр.:

if (decimal.TryParse(stringvalue, out decimal myresult))
{
    // valid conversion comes here
    // myresult will contain a valid number on parse success
}
else
{
    // failed conversion comes here
    // myresult will be zero on parse failure
}