درود
اگر به سورس دات نت دقت کنید Decimal.Parse ذاتا Number.Parse را با style پیشفرض Number فراخوانی میکند.
این بخش از سورس دات نت فریم ورک :
[__DynamicallyInvokable]
public static decimal Parse(string s)
{
return Number.ParseDecimal(s, NumberStyles.Number, NumberFormatInfo.CurrentInfo);
}
زمانی که شما یک type converter را از descriptor دریافت میکنید در زمان model binding اتفاقی که رخ میدهد چیست؟
شما در واقع یک Decimal Converter را دریافت میکنید برای Parse کردن مقدار ارسالی
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
// ...
string text = ((string)value).Trim();
if (culture == null)
culture = CultureInfo.CurrentCulture;
NumberFormatInfo formatInfo = (NumberFormatInfo)culture.GetFormat(typeof(NumberF ormatInfo));
return FromString(text, formatInfo);
// ...
}
return base.ConvertFrom(context, culture, value);
}
مشکل از کجا رخ میدهد ؟ Decimal Converter پیاده سازی FromString را با Float بازنویسی میکند
internal override object FromString(string value, NumberFormatInfo formatInfo)
{
return Decimal.Parse(value, NumberStyles.Float, formatInfo);
}
راه حل شما نوشتن یک Convertor اختصاصی میباشد به شکل زیر
class NumericDecimalConverter : DecimalConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
string text = ((string)value).Trim();
if (culture == null)
culture = CultureInfo.CurrentCulture;
NumberFormatInfo formatInfo = (NumberFormatInfo)culture.GetFormat(typeof(NumberF ormatInfo));
return Decimal.Parse(text, NumberStyles.Number, formatInfo);
}
else
{
return base.ConvertFrom(value);
}
}
}
در نهایت در هنگام استارت اپلیکیشن میتوانید نمونه جدید را با قدیمی به کمک Reflection بازنویسی کنید
TypeDescriptor.AddAttributes(typeof(decimal), new TypeConverterAttribute(typeof(NumericDecimalConver ter)));
شاد باشید.
میتوانید من را در linked-in دنبال کنید. اینجا