PDA

View Full Version : سوال: تبديل



free_rockboy
شنبه 24 مرداد 1388, 19:42 عصر
با سلام به دوستان
ببخشيد ميدونم سوال خيلي تكراريه :خجالت: اما تو تاپيك هاي آخر چيزي پيدا نكردم
ميخوام وقتي كاربر تاريخ را دستي تو textbox وارد ميكنه مثلا به اين صورت 1388/05/22 مميز ها برداشته شه و تبديلش كنم به int
با تشكر

اَرژنگ
شنبه 24 مرداد 1388, 19:50 عصر
با سلام به دوستان
ببخشيد ميدونم سوال خيلي تكراريه :خجالت: اما تو تاپيك هاي آخر چيزي پيدا نكردم
ميخوام وقتي كاربر تاريخ را دستي تو textbox وارد ميكنه مثلا به اين صورت 1388/05/22 مميز ها برداشته شه و تبديلش كنم به int
با تشكر

تنها چیزی که تکرای است در این موضوع اشتباهشه.
کاری که میخواهید معنی ندارد، مشکل اصلیتان چیه؟

asefy2008
شنبه 24 مرداد 1388, 20:08 عصر
سلام دوست من نمی دونم برای چی این کار رو می خواهید انجام بدید ولی چرا از int.parse استفاده نمی کنی می تونه مشکلت رو حل کنه.(بازم مطمین نیستم چون سی شارپ ندارم امتحان کنم)
موفق باشید

free_rockboy
شنبه 24 مرداد 1388, 20:48 عصر
[quote=اَرژنگ;782025]تنها چیزی که تکرای است در این موضوع اشتباهشه.
کاری که میخواهید معنی ندارد، مشکل اصلیتان چیه؟
ببين من ميخوام كاربر تاريخ خاصي را وارد كنه. وبرنامه تو بانك اون تاريخ رو جستوجو كنه و عمليات انجام بشه.
حالا چرا اينطوري؟
من تاريخ را با فرمت yyy/mm/dd بصورت nvarchar تو بانكم دارم كه تو بيشتره عملياتها گير ميده .
براي همين يك فيلد int ساختم و تاريخ روز را بصورت int داخلش ميريزم براي تسهيل كارا :

public string Miladi2Shamsi2(DateTime _date)
{
PersianCalendar pc = new PersianCalendar();
StringBuilder sb = new StringBuilder();
sb.Append(pc.GetYear(_date).ToString("0000"));
sb.Append(pc.GetMonth(_date).ToString("00"));
sb.Append(pc.GetDayOfMonth(_date).ToString("00"));
return sb.ToString();
}
با اين تابع تاريخ yyyymmdd پاس داده ميشه و به int تبديلش ميكنم
string s1 = Miladi2Shamsi2(DateTime.Now);
int tarikhnum = Convert .ToInt32(s1);

free_rockboy
شنبه 24 مرداد 1388, 20:54 عصر
كلا اگر لطف كنيد روشي را بگيد تا مميز ها را از بين اعداد بشه برداشت ممنون ميشم:لبخندساده:

اَرژنگ
شنبه 24 مرداد 1388, 21:33 عصر
كلا اگر لطف كنيد روشي را بگيد تا مميز ها را از بين اعداد بشه برداشت ممنون ميشم:لبخندساده:
۱.روش ذخیره تاریخ در داتابیس بارها بحث شده، و این روشی که شما میخواهید پیاده کنید یکی از روشهایه اشتباه انجام دادن اینکار هست.
۲. پیاده کردن روشهایه من درآوردی برایه نگه داشتن تاریخ در داتابیس (تبدیل به رشته، عدد و غیره و ذالک)، برنامه‌نویسی نیست، کد سیم آوردن است. این طریق روش را در جایی با برنامه نویسهایه حسابی نمیتوانید استفاده کنید.
۳.قبل از اینکه دنبال روش بخصوصی برایه کاری بگردید، اول مشکل واقعی را پژوهش کنید.اینبار مشکل اصلی نگه داری تاریخ در داتابیس بود و نه تبدیل تاریخ به اشکال مختلف.
۴.با استفاده از راههایه استاندارد مقدار مشکلات دیگری را که ممکنه پیش بیاد کم میکنید و قابلیت استفاده از راههایه استاندارد دیگر را برایه حل مشکلات مربوطه بیشتر میکنید.

tdkhakpur
شنبه 24 مرداد 1388, 22:02 عصر
سلام
جرا روش خیلی خوبیه.
این توابع با c هست


int A2I(char *num, short int len)
{
char tmpStr[32];
memcpy(tmpStr, num, len);
tmpStr[len] =0;
return atoi(tmpStr);
}
//--------------------------------
int StrDate2Int ( char Str [], short int Len)
{
int date=0, tmp;
Len = Len == 10 ? (short int)4: (short int)2;
date = A2I (&Str[0], Len);
tmp = A2I (&Str[Len+1], 2);
date = (date<<8) | tmp;
tmp = A2I (&Str[Len+4], 2);
date = (date<<8) | tmp;
return date;
}
//--------------------------------

void Int2StrDate ( char Str [], int num)
{
int tmp;
itoa(num>>16, &Str[0], 10); Str[4] = '/';
itoa(num&0x0000ffff>>8, &Str[5], 10); Str[7] = '/';
itoa(num&0x000000ff, &Str[8], 10); Str[10] = 0;
}

این هم طرز استفاده مقدار عدد 10 در نمونه زیر به منزله 10 رقمی بودن تاریخ یا 4 رقمی بودن عدد سال هست برای مشخص کردن اینکه عدد سال 2 رقمی هست باید به جای 10 عد 8 را وارد کنید.
int num;

char str[12];
num = StrDate2Int("1388/05/22", 10); // تبدیل به عدد
Int2StrDate( str, num); // برگشت از عدد به تاریخ بصورت رشته
ShowMessage(str);

free_rockboy
شنبه 24 مرداد 1388, 23:27 عصر
دوست عزيز جناب ارژنگ- درست يا غلط بودن مطلب را اينطور بايد بهت بگم كه من خودم نظري دربارش ندارم-همين دوستان تو نت و تاپيك ها اي روش را گفتند-درضمن من اگه سوال ميكنم يعني اطلاعاتم كامل نيست ديگه،حالا اصلا شما به من بگو از چه روشي برم؟

int price = Int32.Parse(tprice2.Text);

da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = con;
da.SelectCommand.CommandText =
"update thesab set modakhl=modakhl- "+price+" where tarikhnum="+tarikhnum +"";
da.SelectCommand.CommandType = CommandType.Text;
con.Open();
da.Fill(ds, "t1");
con.Close();

ببين اين كه bold كردم همون تاريخ به فرمت "yyyymmdd" هستش. با اين كار من مشكلي تو بروز رساني ندارم. اما اگه به جايي اون تاريخ را با فرمت اصلي خودش از ورودي بگيرم و داخل فيلدي با فرمت "yyyy/mm/dd" تو پايگاه ذخيره و بخوام مقايسه كنم - اين update انجام نميشه. حالا شما كمكم كنيد- لطف كنيد كدشو بگيد چون دوستان ديگه به اندازه كافي نظرات دادن. با تشكر فراوان

free_rockboy
شنبه 24 مرداد 1388, 23:31 عصر
سلام
جرا روش خیلی خوبیه.
این توابع با c هست

دوست عزيز من هرچي تلاش كردم نتونستم معادل اينو به سي شارپ بنويسم.شما كد سي شارپ را آماده ندارين؟

13601360
شنبه 24 مرداد 1388, 23:57 عصر
string date = "1388/05/25";
string[] str = date.Split('/');
int i = int.Parse(str[0] + str[1] + str[2]);

اَرژنگ
یک شنبه 25 مرداد 1388, 00:39 صبح
string date = "1388/05/25";
string[] str = date.Split('/');
int i = int.Parse(str[0] + str[1] + str[2]);


تصیح شد:


string date = "1388/05/25";
string[] str = date.Split('/');
int i = 10000*int.Parse(str[0]) + 100*int.Parse(str[1]) + int.Parse(str[2]);

13601360
یک شنبه 25 مرداد 1388, 01:05 صبح
جناب آرژنگ کدی که گذاشته بودم غلط بود تست کردم دیدم درسته :خجالت:

اَرژنگ
یک شنبه 25 مرداد 1388, 04:59 صبح
جناب آرژنگ کدی که گذاشته بودم غلط بود تست کردم دیدم درسته :خجالت:
دوست عزیز،
وقتی که آدم یک نفری کار میکنه پیش میاد، برایه همین دوست دارم ۲ نفری کار کنم، هر کی یک قسمت کار را میگیره و با هم دست به دست کار را تمام میکنیم.
فکر نکن کدت غلت بود، بلکه فکر کن که به جواب نزدیک بودید، اگر من اول جواب را فرستاده بودم فکر کردم که همان کد را میدادم. در اکستریم پروگرمینگ تک نفر کد نمینویسه ، بلکه دو نفر با هم مداوم جایشان را عوض میکنند و به کار همدیگر نظارت و مشورت میکنند.
شما یک قسمت از مسئله را حل کردید ، من یک قسمت دیگر، و ما با هم مسئله را حل کردیم :)
در ضمن کدتان کوتاه، تمیز ، مختصر و راحت قابل خواندن بود، به همین دلیل من قابل بودم که فایده‌ای داشته باشم، خیلیها همین ۳ خط را قاطی پاطی و در ۱۰ خط مینوشتن، در آن حالت حتی برایه درک کردن کدشان کسی زمان نمیگذاره، به اینکه چقدر کوتاه و مختصر و تمیز نوشتید فکر کن ، شما کار را راحت کردید که برایه دیگران که فایده داشته باشند.
دفعه دیگر شما کد ما را تکمیل میکنید :)
مخلصیم

user68
دوشنبه 02 شهریور 1388, 15:44 عصر
باسلام
منم یه سوالی توی همین مایه ها داشتم دیگه تاپیک نزرم ممنون میشم جواب بدید. این ارور برای این کد به چه معنیه؟من میخوام دوتا عددی که توی text box1 و result که اونم textbox رو با هم جمع کنه.

textBox1.Text = Convert.ToString ((Convert.ToSingle ( textBox1.Text)) + (Convert.ToSingle (result)));
Unable to cast object of type 'System.Windows.Forms.TextBox' to type 'System.IConvertible'.

Saeed.Masoumi
دوشنبه 02 شهریور 1388, 17:07 عصر
int k;
k = int.Parse(textBox1.Text.Trim()) + int.Parse(result.Text.Trim());

user68
سه شنبه 03 شهریور 1388, 12:58 عصر
ممنون از جوابتون ولی میشه در مورد parse و trim که چی کار میکنند توضیح بدید و این که مشکل کدی که من نوشتم چیه خطایی که میده چه معنیی داره؟
با تشکر

happy65_sh
سه شنبه 03 شهریور 1388, 13:27 عصر
تابع ()Trim برای حذف فاصله ها و کاراکتر های اضافی استفاده میشه.
مشکل کد شما این هست که می خواهی دوتا مقدار از نوع string را باهم جمع کنی.در نتیجه اول باید با استفاده از int.Pars اون ها را به int تبدیل کنی و بعد با هم جمع کنی.

sa_ghaznavi
سه شنبه 03 شهریور 1388, 15:22 عصر
خیلی راحته :

string date;
string day;
string month;
string year;
date = "1388/05/02";
day = date.Substring(8, 2);
month = date.Substring(5, 2);
year = date.Substring(0, 4);