Ich weiß, das ist ein alter Thread, aber ich Ich musste das einfach machen. Während die anderen Ansätze hier funktionieren, wollte ich einen einfachen Weg, um viele Anrufe auf string.format
zu beeinflussen. Das Hinzufügen der Math.Truncate
zu allen Anrufen war nicht wirklich eine gute Option. Auch wenn einige Formatierungen in einer Datenbank gespeichert sind, ist es sogar noch schlimmer geworden.
So machte ich einen benutzerdefinierten Format-Provider, die mir das Abschneiden die Formatierungszeichenfolge hinzufügen würde es ermöglichen, zum Beispiel:
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
Die Implementierung ist ziemlich einfach und ist leicht erweiterbar auf andere Anforderungen.
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;
}
}
Was meinen Sie mit " kultursensibel "? Bedeutet das, dass das Ergebnis der Formatierung abhängig von einem von einem Programmierer bereitgestellten Kulturwert variieren muss? Oder möchten Sie die Kultur verwenden, die standardmäßig für den aktuellen Thread verwendet wird? – CesarGon