Tôi biết đây là một chủ đề cũ nhưng tôi đã phải làm điều này. Trong khi các phương pháp khác ở đây hoạt động, tôi muốn một cách dễ dàng để có thể ảnh hưởng đến rất nhiều cuộc gọi đến string.format
. Vì vậy, thêm Math.Truncate
tất cả các cuộc gọi vào thực sự không phải là một lựa chọn tốt. Ngoài ra, một số định dạng được lưu trữ trong cơ sở dữ liệu, nó còn làm cho nó tồi tệ hơn.
Vì vậy, tôi đã tạo một nhà cung cấp định dạng tùy chỉnh cho phép tôi thêm cắt ngắn vào chuỗi định dạng, ví dụ:
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
Việc thực hiện khá đơn giản và dễ dàng mở rộng cho các yêu cầu khác.
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;
}
}