Frage

Wer weiß, wie ich einen Format-String Banker Rundung ? Ich habe mit „{0: c}“ aber die bedeutet rundet nicht die gleiche Art und Weise, dass Banker Rundung des Fall ist. Die Math.Round() Methode macht Banker Rundung. Ich muß nur in der Lage sein, duplizieren, wie es ein Format-String rundet verwendet wird.


Hinweis: die ursprüngliche Frage war eher irreführend und Antworten regex ergeben sich aus, dass zu erwähnen.

War es hilfreich?

Lösung

Kann man einfach nicht nennen Math.Round () auf dem String-Eingang, das Verhalten, die Sie wollen?

Statt:

string s = string.Format("{0:c}", 12345.6789);

Sie:

string s = string.Format("{0:c}", Math.Round(12345.6789));

Andere Tipps

Regexp ist ein Musterabgleich Sprache. Sie können arithmetische Operationen in Regexp nicht tun.

Haben einige experiements mit IFormatProvider und ICustomFormatter. Hier ist ein Link können Sie in die richtige Richtung weisen. http://codebetter.com/blogs/david. hayden / Archiv / 2006/03/12 / 140732.aspx

Es ist nicht möglich, ein regulärer Ausdruck hat keine Vorstellung von „Zahlen“. Sie könnten einen Spiel Auswerter verwenden aber Sie würden zwingend notwendig, c # -Code das Hinzufügen, und von Ihrer regex verirren würden nur Anforderung.

.Net hat eingebaute Unterstützung für beide Arithmetik und Bankers' Runden:

//midpoint always goes 'up': 2.5 -> 3
Math.Round( input, MidpointRounding.AwayFromZero );

//midpoint always goes to nearest even: 2.5 -> 2, 5.5 -> 6
//aka bankers' rounding
Math.Round( input, MidpointRounding.ToEven );

„Um auch“ Runden eigentlich der Standard ist, auch wenn „von Null weg“ ist, was man in der Schule gelernt.

Dies liegt daran, unter die Haube Computer-Prozessoren tun auch Banker Runden.

//defaults to banker's
Math.Round( input );

Ich hätte gedacht, dass jede Rundung Formatstring Banker Rundungsstandard würde, ist dies nicht der Fall ist?

Wenn Sie .NET 3.5 verwenden, können Sie eine Erweiterungsmethode definieren Sie dies tun, um zu helfen:

public static class DoubleExtensions
{
    public static string Format(this double d)
    {
        return String.Format("{0:c}", Math.Round(d));
    }
}

Dann, wenn Sie es nennen, können Sie tun:

12345.6789.Format();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top