バンカーの丸めを使用するフォーマット文字列を取得する方法を知っている人はいますか? 「{0:c}」を使用していますが、バンカーの丸めと同じように丸められません。このMath.Round()
メソッドは、バンカーの丸めを行います。フォーマット文字列を使用して丸め方を複製できるようにする必要があります。
注:元の質問はかなり誤解を招くものであり、正規表現に言及している回答はそれに由来しています。
バンカーの丸めを使用するフォーマット文字列を取得する方法を知っている人はいますか? 「{0:c}」を使用していますが、バンカーの丸めと同じように丸められません。このMath.Round()
メソッドは、バンカーの丸めを行います。フォーマット文字列を使用して丸め方を複製できるようにする必要があります。
注:元の質問はかなり誤解を招くものであり、正規表現に言及している回答はそれに由来しています。
文字列入力で Math.Round() を呼び出して、必要な動作を取得することはできませんか?
それ以外の:
string s = string.Format("{0:c}", 12345.6789);
行う:
string s = string.Format("{0:c}", Math.Round(12345.6789));
Regexp はパターン マッチング言語です。正規表現で算術演算を行うことはできません。
IFormatProvider と ICustomFormatter でいくつかの実験を行います。ここにリンクがあり、正しい方向を示している可能性があります。http://codebetter.com/blogs/david.hayden/archive/2006/03/12/140732.aspx
.Net には、算術と銀行家の丸めの両方のサポートが組み込まれています。
//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 );
「ゼロから遠ざかる」ことは学校で学んだことですが、実際には「偶数への」丸めがデフォルトです。
これは、内部のコンピュータ プロセッサがバンカーの丸めも行うためです。
//defaults to banker's
Math.Round( input );
丸め書式文字列はデフォルトでバンカーの丸めになると思っていましたが、そうではありませんか?
正規表現には「数値」の概念がありません。マッチ エバリュエーターを使用することもできますが、命令型の C# コードを追加することになり、正規表現のみの要件から逸脱することになります。
.NET 3.5 を使用している場合は、これを行うのに役立つ拡張メソッドを定義できます。
public static class DoubleExtensions
{
public static string Format(this double d)
{
return String.Format("{0:c}", Math.Round(d));
}
}
次に、それを呼び出すと、次のことができます。
12345.6789.Format();