5

有谁知道我如何获得格式字符串以使用银行家四舍五入?我一直在使用“{0:c}”,但这与银行家四舍五入的方式不同。该Math.Round()方法对银行家进行四舍五入。我只需要能够使用格式字符串复制它的舍入方式。


注意:最初的问题相当具有误导性,提到正则表达式的答案就来源于此。

4

5 回答 5

4

你不能简单地在字符串输入上调用 Math.Round() 来获得你想要的行为吗?

代替:

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

做:

string s = string.Format("{0:c}", Math.Round(12345.6789));
于 2008-09-24T17:31:26.000 回答
3

正则表达式是一种模式匹配语言。您不能在 Regexp 中进行算术运算。

用 IFormatProvider 和 ICustomFormatter 做一些实验。这是一个链接,可能会为您指明正确的方向。http://codebetter.com/blogs/david.hayden/archive/2006/03/12/140732.aspx

于 2008-09-24T17:17:41.730 回答
0

这是不可能的,正则表达式没有任何“数字”的概念。您可以使用匹配评估器,但您将添加命令式 c# 代码,并且会偏离您的正则表达式唯一要求。

于 2008-09-24T17:17:45.613 回答
0

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

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

于 2008-09-24T19:54:18.793 回答
0

如果您使用的是 .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();
于 2008-09-24T20:10:28.333 回答