بررسی خطای زمان تبدیل رشته ورودی به اعشار

شنبه 3 مرداد 1394

در این مقاله به خطای در حال اجرای "Input string was not in a correct format" به هنگام تبدیل رشته ورودی به عدد اعشاری می پردازیم و راه حل مشکل را ارائه می دهیم.

بررسی خطای زمان تبدیل رشته ورودی به اعشار

همانطور که می دانید، زبان C# هرچیزی که به عنوان ورودی دریافت می کند به صورت رشته ذخیره می کند. اما مشکل اینجاست که ما، تنها با داده های رشته ای سر و کار نداریم و بخش زیادی از عملیاتی که روی داده ها انجام می دهیم، عملیات محاسباتی و یا منطقی روی داده های عددی می باشد. از این رو کتابخانه .Net امکاناتی برای ما فراهم آورده است.

برای تبدیل نوع داده می توان از دو متد فراهم شده در C# استفاده کرد:

متدهای Parse و Convert، دو متدی هستند که می توان با استفاده از آن داده های رشته ای را به انواع عددی مانند int16، int32، int64 و نوع داده اعشاری مانند double و همچنین flout تبدیل کرد.

کدهای زیر نحوه استفاده از این متدها را به شما نشان می دهد.

 Double grade = Convert.ToDouble(Console.ReadLine());

 Double grade = double.Parse(Console.ReadLine());

در دو خط کد بالا، ورودی وارد شده توسط کاربر تبدیل شده و در متغیری به نام grade که از نوع داده ای double می باشد، ذخیره می شود.

اگر این کدها را در هر قسمتی از برنامه استفاده کنید، می بینید که بدون هیچ خطایی برنامه ساخته می شود. اما بسیاری از کاربران در اجرای این نوع کدها، با مشکل مواجه می شوند و با چنین error exception ای رو به رو می شوند:

Input string was not in a correct format

همان طور که می دانید خطاهای برنامه نویسی سه نوع هستند:

Syntax error: خطاهای مربوط به نگارش کد می باشد که اگر کد شما چنین خطاهایی داشته باشد،

اجازه اجرا شدن به آن داده نمی شود.

Runtime error:خطاهایی که در زمان اجرا ممکن است، رخ دهند. این خطاها به محض رخ دادن، از ادامه برنامه جلوگیری می کنند.

Logical error: خطاهایی که در منطق برنامه نویسی شما وجود دارد و معمولا به سادگی قابل تشخیص نیست و جزء خطاهای خطرناک دسته بندی می شوند.

خطایی که ما در چند خط قبل درباره آن بحث کردیم، یک runtime error (خطای زمان اجرا) می باشد. این مسئله، معمولا زمانی اتفاق می افتد که کاربر ورودی مناسب و مورد انتظار برنامه را وارد نمی کند.

اما این مشکل از کجا می آید و دلیل آن چیست؟

اگر شما عدد اعشاری خود را با جداکننده های مختلف امتحان کنید، متوجه موضوع خواهید شد.

به طور مثال عدد 12.43 را با فرمت های زیر امتحان کنید:

12.43

12,43

12/43

احتمالا در یکی از این ورودی ها با خطا مواجه خواهید شد. این مشکل را culture related می گویند و مربوط به جداکننده پیش فرض اعداد اعشاری در سیستم کاربر می باشد. ممکن است عدد 12.43 در یک سیستم به درستی از ورودی گرفته شده و تبدیل به double شود ولی کاربر دیگری با مشکل مواجه شود.

راه حل:

به طور مثال، می توان جداکننده پیش فرض سیستم را به "." تبدیل کرد و از کاربر خواست، تا اعداد اعشاری را با این فرمت وارد کند. با کد زیر می توان جداکننده پیش فرض سیستم را تغییر داد.

var culture = CultureInfo.CurrentCulture.Clone();

culture.NumberFormat.NumberDecimalSeparator = ".";

و جداکننده جدید را به این شکل به تابع تبدیل موردنظر، ارسال کرد:

 Double grade = double.Parse(Console.ReadLine(),culture);

 حاالا بدون نگرانی می توانید از کاربر بخواهید که اعداد اعشاری را با "." وارد کنند.

همچنین می توانید با اضافه کردن یک آرگومان به متد تبدیل نوع خود (Parse یا Convert) مانند کد زیر، سیستم را مجبور کنید که تنها از جداکننده ثابت "." برای اعداد اعشاری استفاده کند.

Double grade = Convert.ToDouble(Console.ReadLine(),CultureInfo.InvariantCulture);

 به این ترتیب با تغییر تنظیمات پیش فرض، می توان این مشکل را حل کرد.

توجه: لازم به ذکر است که برای استفاده از این کد ها باید، فضای نام زیر را به این صورت به برنامه اضافه کنید.

Using System.Globalization

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 5k بازدید
  • 5 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید