我有一种情况,我需要显示一个舍入到两个小数位的double值,但显示没有小数。在某些情况下我会想要使用相同的代码并以不同的方式显示double值,所以我希望通过传入字符串格式模式来处理这个问题。
例如,double值可能是:11367.2232 我希望价值为:1136722
另一个例子,值可能是344576.3457 我希望值为34457635
第三个例子,值可能是546788 我希望值为54678800
所以,我想做点什么:
String.Format("{PATTERN}", dblCurrency);
是否有任何格式化模式都会舍入到2位小数并删除小数点?
答案 0 :(得分:18)
首先,有(极少数)例外,它是generally bad idea to use double
for manipulating currency values。您应该使用decimal
来表示此类金额。
第二次,舍入和显示格式是单独的操作,您的代码应单独表达。 string.Format()
不会提供同时执行这两种操作的单一格式掩码,但您可以轻松实现所需内容:
decimal amount = 11367.3456m
String.Format( "{0:0}", amount*100 );
将输出:
1136735
D0
格式说明符发出的数值不带任何分隔符,小数点后没有数字。您也可以使用ToString()
,但我认为格式说明符可以更清楚地传达意图。
答案 1 :(得分:0)
使用此:
var dblCurrency = 11367.2232D;
var rounded = Math.Round(dblCurrency, 2);
var cents = rounded*100;
var centString = cents.ToString();
答案 2 :(得分:0)
您可以使用这样的自定义格式化功能:
string ScaledFormat(string format, double value, double scaleFactor)
{
return(string.Format(format, Math.Round(value * scalefactor, 0)));
}
或者,如果您只有几种格式样式,我会使用枚举:
enum CustomFormat { Integer, IntegerX100 };
string ScaledFormat(CustomFormat format, double value)
{
switch(format)
{
case CustomFormat.Integer: return(string.Format("{0}", (int) value);
case CustomFormat.IntegerX100: return(string.Format("{0}", Math.Round(value * 100.0, 0));
}
}
这意味着可以通过多种方式对值进行格式化,并且实际转换完全封装在方法中,确保整个程序的输出一致,并避免在任何地方散布“魔术常量”。它还集中了格式化,因此您可以在将来轻松调整它,而无需查找和更正数百个不同的string.Format调用,并减少必要的测试,因为您只需重新使用一小段经过良好测试的代码。它使得格式化字符串的情况更容易阅读/理解(自我记录代码)。
答案 3 :(得分:0)
要获得所需的功能,请尝试以下方法:
decimal dNumber = 11367.2232;
String.Format( "{0:0}", Math.Round(amount, 2) * 100));
这应输出1136722。