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 tiếp cận khác ở đây hoạt động, tôi muốn một cách dễ dàng để có thể ảnh hưởng đến nhiều cuộc gọi đến string.format
. Vì vậy, việc thêm Math.Truncate
vào tất cả các cuộc gọi không thực sự là một lựa chọn tốt. Cũng như một số định dạng được lưu trữ trong cơ sở dữ liệu, nó thậm chí còn tồi tệ hơn.
Vì vậy, tôi đã cung cấp tùy chỉnh định dạng mà sẽ 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à có thể dễ dàng thể mở rộng đến 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;
}
}
Ý anh là gì bởi " văn hóa nhạy cảm "? Điều đó có nghĩa là kết quả của định dạng phải khác nhau tùy thuộc vào giá trị văn hóa do nhà lập trình cung cấp? Hay bạn muốn sử dụng bất kỳ nền văn hóa nào là mặc định cho chuỗi hiện tại? – CesarGon