2017-01-05 2 views
1

Я пытаюсь сохранить .text метки в базу данных, но иногда эта метка является символом бесконечности. Чтобы поймать это, я создал оператор if, который проверяет, является ли метка числом или нет, и выдает окно сообщения, чтобы сообщить пользователю. Однако чаще всего метка будет десятичным числом, а оператор if вызывает окно сообщения. Мне было интересно, может ли кто-нибудь помочь мне?Оператор C# if для проверки, если значение не является числом

private void btnSaveResults_Click(object sender, EventArgs e) 
{ 
    btnClearData.Enabled = true; 


    if (System.Text.RegularExpressions.Regex.IsMatch(lblAerobicCap.Text, "[^0-9]")) 
    { 
     MessageBox.Show("Im sorry, there seems to have been an error in the inputting of the readings, please restart the test"); 

    } 


    else 
    { 
     AthletesDetailsNew users = new AthletesDetailsNew(); 

     DateTime dateTimeVariable = DateTime.Now; 

     users.Date_Of_Test = dateTimeVariable; 
     users.First_Name = comboBoxFirstName.Text; 
     users.Surname = comboBoxNewSurname.Text; 
     users.Age = int.Parse(comboBoxAge.Text); 
     users.Account_Number = int.Parse(comboBoxAccountNumber.Text); 
     users.Aerobic_Capacity = /*Math.Truncate*/(decimal.Parse(lblAerobicCap.Text)); 


     DataClassDataContext dbCtx = new DataClassDataContext(); 

     dbCtx.AthletesDetailsNews.InsertOnSubmit(users); 

     try 
     { 
      dbCtx.SubmitChanges(); 
      MessageBox.Show("Data saved"); 
     } 

     catch 
     { 
      MessageBox.Show("Data failed to save"); 

     } 
    } 
} 
+6

Try используя 'double.TryParse()' –

+1

Или 'decimal.TryParse'. У типов, у которых есть метод 'Parse', также есть' TryParse' –

+0

Обратите внимание, что OP уже проверяет, является ли это число числом, поэтому проблема не выглядит на 'double.Parse()'. – wdosanjos

ответ

2

Использование decimal.TryParse так и в случае успеха вы можете повторно использовать результат

decimal aerobicCap = -1; 
if (!decimal.TryParse(lblAerobicCap.Text, out aerobicCap)) 
{ 
    MessageBox.Show("Im sorry, there seems to have been an error in the inputting of the readings, please restart the test"); 
} 
else 
{ 
    // code ... 
    users.Aerobic_Capacity = aerobicCap; 
+0

Спасибо, что очень помогли мне :) – robbiedarza

3

Для этого вам необходимо использовать метод .TryParse().

, например:

decimal value; 
bool isNumber = Decimal.TryParse(inputVariable, out value); 
+1

Спасибо, что сработал :) – robbiedarza

0

Я думаю, вам нужно обрезать пробелы из lblAerobicCap.Text до проверки, если значение число. Что-то вроде lblAerobicCap.Text = lblAerobicCap.Text.Trim().

lblAerobicCap.Text = lblAerobicCap.Text.Trim(); 

if (System.Text.RegularExpressions.Regex.IsMatch(lblAerobicCap.Text, "[^0-9]")) 
{ 
    MessageBox.Show("Im sorry, there seems to have been an error in the inputting of the readings, please restart the test"); 

} 
[ ... ] 
+0

Спасибо вам большое за вашу помощь! – robbiedarza

0

Лучше все же избегать ввода пользователем ничего, кроме цифр. Таким образом, вам не нужно проверять ввод.

Для цифр использовать что-то вроде этого:

void Control_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (!Char.IsDigit(e.KeyChar)) 
    { 
     e.Handled = true; 
    } 
} 

Decimal:

void Control_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode != Keys.Decimal) 
    { 
     e.Handled = true; 
    } 
} 
0

Я использовал метод расширения в прошлом, который работает хорошо для меня:

public static bool IsNumber(this object value) 
{ 
    return value is sbyte 
      || value is byte 
      || value is short 
      || value is ushort 
      || value is int 
      || value is uint 
      || value is long 
      || value is ulong 
      || value is float 
      || value is double 
      || value is decimal; 
} 

object testObject = 0.1; 
if (testObject.IsNumber()) { MessageBox.Show("Hooray!"); } 
Смежные вопросы