मुझे पता है कि यह एक पुराना धागा है लेकिन मुझे ऐसा करना पड़ा है। जबकि अन्य दृष्टिकोण यहाँ काम करते हैं, मैं एक आसान तरीका चाहता था जो बहुत सारे कॉल को प्रभावित कर सके 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;
}
}