مثالهای عملی مستقل
مثالها از تبدیل پایه شروع میشوند و به داده دستهای، null، مقدار مرزی، خطای کنترلشده و مسیر بهینه میرسند. هر نمونه یک برنامه کامل کنسولی است و خروجی نمایشی اجازه میدهد نتیجه را بدون اجرای فوری کد بررسی کنید.
مثال 1: تبدیل مبلغ فاکتور
در سناریوی «تبدیل مبلغ فاکتور»، decimal.Parse() یک رشته معتبر را به مقدار نوعدار تبدیل میکند تا ادامه برنامه با داده خام درگیر نباشد.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string text = "125000.50";
decimal value = decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(value.ToString(System.Globalization.CultureInfo.InvariantCulture));
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | 125000.50 | تبدیل مبلغ فاکتور |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 2: پاکسازی قیمت ورودی
برای «پاکسازی قیمت ورودی»، فاصله یا شکل نمایش ورودی آگاهانه مدیریت میشود و قرارداد تبدیل روشن باقی میماند.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string text = " 125000.50 ";
decimal value = decimal.Parse(text.Trim(), System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(value.ToString(System.Globalization.CultureInfo.InvariantCulture));
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | 125000.50 | پاکسازی قیمت ورودی |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 3: پردازش ردیفهای مالی
نمونه «پردازش ردیفهای مالی» چند مقدار مستقل را پردازش میکند و کاربرد این نوع را در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند نشان میدهد.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string[] values = { "125000.50", "125000.50", "125000.50" };
int parsedCount = 0;
foreach (string text in values)
{
_ = decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
parsedCount++;
}
Console.WriteLine($"ParsedCount={parsedCount}");
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | ParsedCount=3 | پردازش ردیفهای مالی |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 4: کنترل مبلغ مثبت
در «کنترل مبلغ مثبت»، خروجی نوعدار مستقیماً وارد شرط میشود؛ با این حال اعتبار دامنه از اعتبار قالب جدا نگه داشته میشود.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string text = "125000.50";
decimal value = decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
if (value > 0)
{
Console.WriteLine("Positive");
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | Positive | کنترل مبلغ مثبت |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 5: مشاهده Decimal در Runtime
مثال «مشاهده Decimal در Runtime» ثابت میکند خروجی فقط یک متن تغییرشکلیافته نیست و Runtime نوع واقعی مقصد را ایجاد کرده است.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string text = "125000.50";
decimal value = decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine($"Value={value}; Type={value.GetType().Name}");
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | Value=125000.50; Type=Decimal | مشاهده Decimal در Runtime |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 6: سیاست مبلغ مفقود
در «سیاست مبلغ مفقود»، چون Parse برای null قرارداد موفقی ندارد، سیاست مقدار پیشفرض پیش از فراخوانی اعمال میشود.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string? text = null;
decimal value = text is null ? default : decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(value);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | 0 | سیاست مبلغ مفقود |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 7: آزمون بیشینه decimal
آزمون «آزمون بیشینه decimal» کران مهم نوع مقصد را میسنجد؛ محدوده این مقاله عدد دهدهی 128 بیتی با 28 تا 29 رقم معنیدار است.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string text = "79228162514264337593543950335";
decimal value = decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(value == decimal.MaxValue);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | True | آزمون بیشینه decimal |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 8: پذیرش مبلغ سفارش
سناریوی «پذیرش مبلغ سفارش» به یک کاربرد پروژهای در حوزه پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند نزدیک است و مقدار تبدیلشده را وارد منطق کسبوکار میکند.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string quantityText = "125000.50";
decimal quantity = decimal.Parse(quantityText, System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine($"Accepted={quantity > 0}; Value={quantity}");
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | Accepted=True; Value=125000.50 | پذیرش مبلغ سفارش |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 9: مدیریت عدد مالی نامعتبر
در «مدیریت عدد مالی نامعتبر»، FormatException یا OverflowException فقط در مرزی مدیریت میشود که امکان ارائه پیام اصلاحی وجود دارد.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string text = "not-a-number";
try
{
_ = decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
}
catch (Exception ex) when (ex is FormatException || ex is OverflowException)
{
Console.WriteLine(ex.GetType().Name);
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | FormatException یا OverflowException | مدیریت عدد مالی نامعتبر |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 10: اعتبارسنجی سریع Import حسابداری
نمونه «اعتبارسنجی سریع Import حسابداری» از TryParse استفاده میکند تا شکست عادی بدون ساخت استثنا گزارش شود و مسیر پرترافیک خوانا بماند.
using System;
using System.Globalization;
public static class Program
{
public static void Main()
{
string text = "125000.50";
if (decimal.TryParse(text, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out decimal value))
{
Console.WriteLine(value);
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 125000.50 | 125000.50 | اعتبارسنجی سریع Import حسابداری |
کاربرد عملی این الگو در پول، مالیات، حسابداری، قیمتگذاری و محاسباتی که دقت دهدهی قطعی لازم دارند دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
سؤالات متداول
۱. decimal.Parse() دقیقاً چه کاری انجام میدهد؟
decimal.Parse() نمایش متنی معتبر را مطابق قواعد نوع مقصد به یک مقدار نوعدار تبدیل میکند. نتیجه پس از تبدیل میتواند در محاسبه، شرط، ذخیرهسازی یا منطق دامنه استفاده شود و دیگر لازم نیست با رشته خام کار کنیم.
۲. چه زمانی استفاده از decimal.Parse() برای تازهکاران مناسب است؟
وقتی منبع داده مورد اعتماد است، قالب از قبل اعتبارسنجی شده و شکست واقعاً یک وضعیت استثنایی محسوب میشود، Parse انتخابی ساده و خواناست. برای ورودی مستقیم کاربر معمولاً TryParse تجربه مقاومتری ایجاد میکند.
۳. آیا استفاده درست از decimal.Parse() هزینه نگهداری پروژه را کم میکند؟
بله؛ تبدیل در مرز سیستم و انتقال مقدار نوعدار به لایههای داخلی، شرطهای تکراری و خطاهای پنهان را کاهش میدهد. این جداسازی در پروژههای تجاری، گزارشگیری و سامانههای چندلایه ارزش زیادی دارد.
۴. در پروژه سفارشی چگونه سیاست تبدیل decimal.Parse() طراحی میشود؟
قالب ورودی، فرهنگ، رفتار null، محدوده مجاز، پیام خطا و محل ثبت رخداد باید در قرارداد ورودی مشخص شوند. سپس تبدیل در یک نقطه مشترک مانند Validator، Mapper یا لایه ورودی پیادهسازی و با تست پوشش داده میشود.
۵. تفاوت کلیدی Parse و TryParse برای decimal.Parse() چیست؟
Parse در شکست استثنا پرتاب میکند، ولی TryParse با یک مقدار bool موفقیت را گزارش میدهد و خروجی را از پارامتر out تحویل میدهد. تفاوت اصلی در قرارداد شکست است، نه صرفاً شکل نوشتن کد.
۶. برای پیادهسازی حرفهای decimal.Parse() چه خدماتی لازم میشود؟
در سامانه حساس میتوان از بازبینی قرارداد داده، طراحی اعتبارسنجی، تست دادههای مرزی، پروفایل کارایی و ثبت خطای ساختیافته استفاده کرد. مشاوره فنی کمک میکند این تصمیمها با معماری و نیاز واقعی محصول هماهنگ شوند.
۷. خطاهای رایج decimal.Parse() کداماند؟
ارسال null، رشته خالی، قالب ناسازگار، عدد خارج از محدوده، فرهنگ اشتباه و گرفتن کلی همه Exceptionها از خطاهای پرتکرار هستند. ثبت مقدار حساس نیز باید با قواعد امنیت و حریم خصوصی هماهنگ شود.
۸. آیا decimal.Parse() از نظر Performance کند است؟
روی ورودی معتبر معمولاً تبدیل سریع است؛ مشکل اصلی زمانی رخ میدهد که داده نامعتبر زیاد باشد و Parse مرتب استثنا بسازد. اندازهگیری با داده واقعی، Release build، Runtime هدف و ابزار مناسب از حدس بهتر است.
۹. بهترین روش استفاده از decimal.Parse() چیست؟
فرهنگ و قالب را صریح کنید، تبدیل را در مرز ورودی نگه دارید، دامنه مجاز را جداگانه بسنجید، از تبدیل تکراری جلوگیری کنید و برای تمام کرانها تست داشته باشید. شکست قابل انتظار را نیز با TryParse مدل کنید.
۱۰. decimal.Parse() با کدام نسخههای C# و .NET سازگار است؟
شکلهای پایه Parse سالهاست در .NET وجود دارند، اما overloadهای Generic، Span و رابطهای جدید مانند IParsable به نسخه Runtime وابستهاند. پیش از استفاده از overload جدید، Target Framework پروژه و مستندات همان نسخه را کنترل کنید.