PDA

View Full Version : مشکل در متد Contains یک متغیر String



arash ghafori
یک شنبه 15 اردیبهشت 1392, 23:20 عصر
با سلام.
من یه متدی دارم که یک String به عنواد پارامتر میگیره و با یه For چک میکنه گه توی اون String ، رشته یا کارکتری وجود نداشته باشه ( یعنی در واقع اون رشته فقط باید عدد باشه ). متد زیر :


public char[] Numbers = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
//متدی که چک میکنه
public bool textContainsUnacceptable(string T, char[] Nambers)
{
for (int i = 0; i < Nambers.Length; i++)
if (T.Contains(Nambers[i]))
{
return false;
}

return true;
}

//اینطوری هم فراخوانیش میکنم.
if (textContainsUnacceptable(name, Numbers))
{
throw new Exception("در فیلد" + " " + object_name + " " + "فقط عدد وارد کنید");
}


همه چیز درست پیش میره تا زمانی که یه رشته که هم عدد داره هم کارکتر رو بهش پاس میکنم. ( مثلا 12345as47sd) . و برنامه هم قبول میکنه .

چرا ؟ مگه متد Contains معنی "شامل بودن" رو نمیده ؟ خوب این هم شامل کارکتر هست و غیر قابل قبول ...!

ممنون میشم کمکم کنید.

_behnam_
یک شنبه 15 اردیبهشت 1392, 23:28 عصر
سلام.
اول اینکه واسه اینکه بدونید که توی یک رشته مقداری که میخواید وجود داره بهتره از متد IndexOf استفاده کنید.
دوم اینکه اگه متد رو فقط و فقط واسه این نوشتید که بیاد چک کنه که عدد هست یا خیر "کار عاقلانه ای نیست".

arash ghafori
یک شنبه 15 اردیبهشت 1392, 23:38 عصر
سلام.
اول اینکه واسه اینکه بدونید که توی یک رشته مقداری که میخواید وجود داره بهتره از متد IndexOf استفاده کنید.
دوم اینکه اگه متد رو فقط و فقط واسه این نوشتید که بیاد چک کنه که عدد هست یا خیر "کار عاقلانه ای نیست".


ممنون از اینکه پاسخ دادید.
خوب به نظر شما چطوری چک کنم که فقط عدد بگیره ؟
ممنون میشم راهنماییم کنید.

مهرداد صفا
یک شنبه 15 اردیبهشت 1392, 23:45 عصر
با سلام.
میتوانید در یک حلقه تکتک کاراکتر ها را با متود Char.IsDigit چک کنید:

if((from ch in text where char.IsDigit(ch) select ch).Count()>0)
{
MessageBox.Show("string has number!");
}

arash ghafori
یک شنبه 15 اردیبهشت 1392, 23:52 عصر
با سلام.
میتوانید در یک حلقه تکتک کاراکتر ها را با متود Char.IsDigit چک کنید:

if((from ch in text where char.IsDigit(ch) select ch).Count()>0)
{
MessageBox.Show("string has number!");
}

ممنون از پاسختون دوست عزیز.
اما میشه یه توضیح بدید این کد رو ! یکم گنگه !
بعد این متد میگه اگر عدد وارد کنیم قبول نیست . ( دقیقا برعکس اون چیزی که من میخوام ! ).
ممنون میشم راهنماییم کنید.

_behnam_
یک شنبه 15 اردیبهشت 1392, 23:53 عصر
این متد خوبی هست واسه کار شما.


private bool checkStr(string str)
{
System.Text.RegularExpressions.Regex Reg = new System.Text.RegularExpressions.Regex("^[0-9]+$");
return Reg.IsMatch(str);
}

arash ghafori
دوشنبه 16 اردیبهشت 1392, 00:19 صبح
private bool checkStr(string str)
{
System.Text.RegularExpressions.Regex Reg = new System.Text.RegularExpressions.Regex("^[0-9]+$");
return Reg.IsMatch(str);
}[/QUOTE]
ممنون دوست عزیز. کد جالبی بود و البته منطقی تر از واسه من. !
اما این
Regex("^[0-9]+$"); یعنی چی ؟ این پترنا رو چطوری میشه فهمید ؟ بر چه حثبی میشه نوشت ؟
بازم ممنون

Mahmoud.Afrad
دوشنبه 16 اردیبهشت 1392, 00:26 صبح
bool IsNumeric1(string str)
{
if (string.IsNullOrWhiteSpace(str))
{
return false;
}
foreach (char ch in str)
{
if (!char.IsDigit(ch))
{
return false;
}
}
return true;
}

و یا

bool IsNumeric2(string str)
{
if (string.IsNullOrWhiteSpace(str))
{
return false;
}
return str.All(ch => char.IsDigit(ch));
}

_behnam_
دوشنبه 16 اردیبهشت 1392, 00:27 صبح
به این روش میگم عبارات باقاعده یا عبارات منظم.
سرچ کنید در مورد عبارات باقاعده نتایج خوبی بدست میاد.
و برای الگوها اینجا (http://barnamenevis.org/barnamenevis.org/showthread.php?139020-معرفی-برخی-علائم-عبارات-منظم)سر بزنید.

مهرداد صفا
دوشنبه 16 اردیبهشت 1392, 00:41 صبح
ممنون از پاسختون دوست عزیز.
اما میشه یه توضیح بدید این کد رو ! یکم گنگه !
بعد این متد میگه اگر عدد وارد کنیم قبول نیست . ( دقیقا برعکس اون چیزی که من میخوام ! ).
ممنون میشم راهنماییم کنید.

بله می بخشید. در اون صورت یک ! به قبل از IsDigit اضافه میکنیم تا کاارکتر هایی که عدد نیستند جستجو شوند و در صورتی که تعدادشان بیشتر از 0 باشد شرط اجرا می شود که البته جناب Mahmoud.Afrad کاملتر مطرح کردند. روش جناب _behnam_ هم کاملا درست است.

uniqueboy_ara
دوشنبه 16 اردیبهشت 1392, 00:45 صبح
از این تابع استفاده کن، خیلی راحت و بی دردسر:
private bool DigitCheck(string Input)
{
double Result;
return double.TryParse(Input, out Result);
}

tooraj_azizi_1035
دوشنبه 16 اردیبهشت 1392, 12:47 عصر
ممنون دوست عزیز. کد جالبی بود و البته منطقی تر از واسه من. !
اما این
Regex("^[0-9]+$"); یعنی چی ؟ این پترنا رو چطوری میشه فهمید ؟ بر چه حثبی میشه نوشت ؟


سلام
در عبارات باقاعده، ^ به معنی ابتدای رشته است یعنی اصرار داریم تا در ابتدای رشته تطبیق انجام شود.
[0-9[ یعنی فقط 0 تا 9 قابل قبول است (یعنی هر کاراکتری که به آن برمی خورد باید یکی از اینها باشد)
+ یعنی می تواند بیش از یکی باشد.
$ علامت خاتمه رشته است.
در گوگل Regular Expressions رو جستجو کن. نرم افزار RegexBuddy هم راهنمای عالی داره.

arash ghafori
دوشنبه 16 اردیبهشت 1392, 19:11 عصر
ممنون از همه.