Raja Ganapathy Ответов: 4

Как проверить только числа в столбце таблицы данных?


У меня есть одна таблица данных в этой таблице данных один столбец имеет "номер продукта" (описание) и имеет значения типа 1,2,3,4,5 теперь я хочу проверить только числовое значение в этом столбце любой специальный символ или буквы в этом столбце показывают сообщение проверки, как это сделать.

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

Я использовал
Regex r = new Regex(@"[~`!@#$%^&*()-+=|\{}':;.,<>/?]");

но регулярное выражение является только логическим. и еще один метод, который я использовал
string MyString = "[~`!@#$%^&*()-+=|\{}':;.,<>/?]";
string mystring2 = "[^a-zA-Z]";
if (ds.Tables[s].Rows[i][Columncountvalue].ToString().Trim() == mystring2 || if (ds.Tables[s].Rows[i][Columncountvalue].ToString().Trim() == MyString))
{
//throw error message
}

Но это показывает "непризнанную escape-последовательность" этого сообщения об ошибке.

Wendelius

Не могли бы вы объяснить немного подробнее, привести некоторые примеры данных и ожидаемый результат?

Raja Ganapathy

товара нет
1
2
3
4
5
6
7
как в этом порядке.
если ввести специальный символ или букву, то появится сообщение об ошибке.

[no name]

Конечно. MyString и mystring2 являются регулярными выражениями, и вы не используете их как регулярное выражение. С другой стороны, если вы пытаетесь решить проблему с помощью регулярного выражения, то у вас есть две проблемы.

Raja Ganapathy

Как это исправить.

[no name]

Попробуйте использовать регулярное выражение как регулярное выражение, а не просто сравнивать строки.

4 Ответов

Рейтинг:
29

Wendelius

Я не уверен, зачем вам нужны регулярные выражения, чтобы проверить, являются ли данные числом или нет. Один очень простой способ-использовать метод TryParse. Например, если ожидается, что число будет целым числом, просто используйте Типа int32.Метод TryParse (String, Int32) (System)[^]

Во-вторых, зачем вам вообще нужно это проверять? Если это столбец datatable, просто определите тип данных столбца как integer. Если значение, которое вы пытаетесь установить, не является целым числом, автоматически создается исключение. Взгляните на объект DataColumn.Свойство DataType (System. Data)[^]


Maciej Los

Хороший совет!

Raja Ganapathy

int parsedValue;
если (! int.TryParse(textBox. Text, out parsedValue))
{
}
спасибо я использую это

Рейтинг:
27

Maciej Los

Не уверен, что хорошо вас понимаю, но ... .

Взгляните на пример:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Product Number", typeof(string)));

dt.Rows.Add(new object[] {"1"});
dt.Rows.Add(new object[] {"2"});
dt.Rows.Add(new object[] {"o1"}); //non-number
dt.Rows.Add(new object[] {"5"});
dt.Rows.Add(new object[] {"7"});
dt.Rows.Add(new object[] {"1t"}); //non-number
dt.Rows.Add(new object[] {"8"});
dt.Rows.Add(new object[] {"9"});
dt.Rows.Add(new object[] {" 1u "}); //non-number
dt.Rows.Add(new object[] {"111"});

//get only numbers
var numbersonly = dt.AsEnumerable()
	.Where(x=>Regex.IsMatch(x.Field<string>("Product Number"), @"^\d{1,}$"))
	.ToList();
	//see result 1
	
//get non-numbers
var nonnumbersonly = dt.AsEnumerable()
	.Except(numbersonly)
	.ToList();
	//see result 2


Результат №1
Product Number
1 
2 
5 
7 
8 
9 
111 


Результат №2

Product Number
o1 
1t 
 1u  


Для получения более подробной информации, пожалуйста, смотрите:
Регулярное выражение.Метод Ismatch (Строка, Строка) (Система.Текст.RegularExpressions)[^]
Перечислимый.Кроме Метода (System. Linq)[^]

Удачи!


Wendelius

Хороший пример!

Maciej Los

Спасибо, Мика.

Raja Ganapathy

int parsedValue;
если (! int.TryParse(textBox. Text, out parsedValue))
{
}
спасибо я использую это

Raja Ganapathy

int parsedValue;
если (! int.TryParse(textBox. Text, out parsedValue))
{
}
спасибо я использую это

Рейтинг:
16

W∴ Balboos, GHB

Другое решение, помимо существенного упоминания об определении столбца int-only в таблице как типа int, заключается в проверке на стороне клиента.

Поле должно разрешать только числовой ввод. Вы можете установить это практически на любом языке, проверяя (например) после каждого нажатия клавиши. Остерегайтесь событий типа "onChange", если вы не отслеживаете изменения, которые вы сами можете внести - как вы можете через свое приложение в рекурсивный цикл.

Но профилактика на стороне клиента-хорошая практика. Для этого вы можете использовать регулярное выражение в своем обработчике событий-просто замените все, что не является числовым, на ничто.


Рейтинг:
1

Patrice T

Этот код совершенно неверен:

string MyString = "[~`!@#$%^&*()-+=|\{}':;.,<>/?]";
string mystring2 = "[^a-zA-Z]";
if (ds.Tables[s].Rows[i][Columncountvalue].ToString().Trim() == mystring2 || if (ds.Tables[s].Rows[i][Columncountvalue].ToString().Trim() == MyString))
{
//throw error message
}

Вам нужно научиться использовать регулярные выражения.

Совет: обычно легче соответствовать тому, что вы хотите, а не тому, чего вы не хотите.

Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
Это показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]