有谁知道我如何获得格式字符串以使用银行家四舍五入?我一直在使用“{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
这是不可能的,正则表达式没有任何“数字”的概念。您可以使用匹配评估器,但您将添加命令式 c# 代码,并且会偏离您的正则表达式唯一要求。
.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();