C#Double - ToString格式化显示以美分显示的值,不显示小数

时间:2010-07-28 19:02:45

标签: c# .net double tostring

我有一种情况,我需要显示一个舍入到两个小数位的double值,但显示没有小数。在某些情况下我会想要使用相同的代码并以不同的方式显示double值,所以我希望通过传入字符串格式模式来处理这个问题。

例如,double值可能是:11367.2232 我希望价值为:1136722

另一个例子,值可能是344576.3457 我希望值为34457635

第三个例子,值可能是546788 我希望值为54678800

所以,我想做点什么:

String.Format("{PATTERN}", dblCurrency);

是否有任何格式化模式都会舍入到2位小数并删除小数点?

4 个答案:

答案 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。