C# .NET货币格式化程序:我是否可以指定使用banker';是四舍五入吗?

C# .NET货币格式化程序:我是否可以指定使用banker';是四舍五入吗?,c#,.net,formatting,bankers-rounding,C#,.net,Formatting,Bankers Rounding,有人知道我如何使用格式字符串吗?我一直在使用“{0:c}”,但它的取整方式与银行家的不同。这种方法不需要四舍五入。我只需要能够复制它如何轮使用格式字符串 注意:原来的问题相当误导,提到regex的答案就是从中得出的。 Regexp是一种模式匹配语言。不能在Regexp中进行算术运算 使用IFormatProvider和ICustomFormatter进行一些实验。这里有一个链接可能会为您指明正确的方向 这是不可能的,正则表达式没有任何“数字”的概念。您可以使用a,但这会添加命令式c代码,并且

有人知道我如何使用格式字符串吗?我一直在使用“{0:c}”,但它的取整方式与银行家的不同。这种方法不需要四舍五入。我只需要能够复制它如何轮使用格式字符串


注意:原来的问题相当误导,提到regex的答案就是从中得出的。 Regexp是一种模式匹配语言。不能在Regexp中进行算术运算


使用IFormatProvider和ICustomFormatter进行一些实验。这里有一个链接可能会为您指明正确的方向

这是不可能的,正则表达式没有任何“数字”的概念。您可以使用a,但这会添加命令式c代码,并且会偏离仅限正则表达式的要求。

您不能简单地对字符串输入调用Math.Round()来获得所需的行为吗

而不是:

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


.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 );

我原以为任何舍入格式字符串都会默认为银行家舍入,不是吗?

如果您使用的是.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();

{0:c}是什么类型的正则表达式?在我看来更像是一个.NET格式的字符串…只是出于好奇,为什么这需要是一个正则表达式?似乎使用现有代码会更安全,因为它不太可能包含bug。银行家的取整是什么?如果对银行有利,则上升,否则下降?@MattW:Banker's Rounding是治疗在
0.5
上取整的人的方法<代码>0.5正好是0和1之间的一半,两者都不接近。决定你总是要取整是引入了偏见(例如,你支付的税不应该总是取整-这是不公平的)。银行家四舍五入是这样设置的:一半的时间你四舍五入,一半的时间你四舍五入,这就平衡了事情。该算法总是向偶数位进位。e、 g.:
0.5->0
1.5->2
2.5->2
3.5->4
4.5->4
我确信这个功能解决了问题,但它增加了额外的麻烦和代码调用。我以前也遇到过这个问题,我想可以用“是否有用于舍入的格式字符串?”来表示:在只能提供格式字符串的情况下,例如在使用DisplayFormattribute时,这不起作用。我们进行银行舍入的原因是它(通常)给出一个更接近的结果-由于赔率和偶数通常是相当均匀的分布,你有时会得到0.005美元,有时会得到0.005美元。我不确定CPU是否关心这两种情况,但我们的会计师肯定会这样做…CPU会这样做-正是因为这个原因。这就是为什么ToEven是默认值-它消除了偏见(或至少消除了偏见)。这在浮点计算中很有用,就像在银行中一样。
12345.6789.Format();