আমি জানি এটি একটি পুরানো থ্রেড তবে আমার কেবল এটি করতে হয়েছিল। এখানে অন্যান্য পদ্ধতির কাজ করার সময়, আমি প্রচুর কলগুলিকে প্রভাবিত করতে সক্ষম হওয়ার একটি সহজ উপায় চাইছিলাম string.format
। সুতরাং Math.Truncate
সমস্ত কলগুলিতে যুক্ত করা আসলে কোনও ভাল বিকল্প ছিল না। কিছু ফরম্যাটিং যেমন একটি ডাটাবেসে সংরক্ষণ করা হয়, এটি এটিকে আরও খারাপ করে তুলেছে।
সুতরাং, আমি একটি কাস্টম বিন্যাস সরবরাহকারী তৈরি করেছি যা আমাকে ফর্ম্যাটিং স্ট্রিংয়ে কাটা যোগ করতে দেয়, যেমন:
string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12
string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123
string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9
বাস্তবায়নটি বেশ সহজ এবং অন্যান্য প্রয়োজনীয়তার জন্য সহজেই প্রসারিত।
public class FormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof (ICustomFormatter))
{
return this;
}
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null || arg.GetType() != typeof (double))
{
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
if (format.StartsWith("T"))
{
int dp = 2;
int idx = 1;
if (format.Length > 1)
{
if (format[1] == '(')
{
int closeIdx = format.IndexOf(')');
if (closeIdx > 0)
{
if (int.TryParse(format.Substring(2, closeIdx - 2), out dp))
{
idx = closeIdx + 1;
}
}
else
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
}
double mult = Math.Pow(10, dp);
arg = Math.Truncate((double)arg * mult) / mult;
format = format.Substring(idx);
}
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
private string HandleOtherFormats(string format, object arg)
{
if (arg is IFormattable)
{
return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture);
}
return arg != null ? arg.ToString() : String.Empty;
}
}