格式化小数而不舍入

时间:2014-09-12 20:48:45

标签: c#

我对C#还不熟悉,并且想知道是否有人可以帮助解决以下代码问题。我无法找到一个IF语句插入" --------- INSERT IF STATEMENT HERE"。我正在利用SQL转换(十进制(28,10))将数值限制为10个小数点。基本上,我想通过利用C#删除报表设计器中的零。以下几个例子:

首选格式:4.25 vs 4.2500000000 首选格式:0.00 vs 0.0000000000

没有额外的零点。 目前的名义金额:22,000,000.00

假设的例子:

22,000,000.12344567890(可用时最多10位小数)

我可以使用以下代码删除零;但是,对于我所有的数值,我被限制为两个零。因此4.2500000000显示为4.25,但4.2511实际显示为4.25。有人可以帮忙吗?

public void Detail1_Format()
{ DataDynamics.ActiveReports.TextBox tb1;
String s;
Double d;
String ColName;
s = ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text;
ColName = ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtColName1"]).Text;
if((ColName == "Price") || (ColName == "Shares (Par or Notional)"))
{
    if(Double.TryParse(s, out d) == true)
    {
        d = Convert.ToDouble(s);
        tb1 = (DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"];
---------INSERT IF STATEMENT HERE
        {tb1.Text = d.ToString("#,###.##########");}
---------else {
        {tb1.Text = d.ToString("#,###.00");
        }
        ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text = tb1.Text;}
}
else {
    ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text = ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text;
}
}

2 个答案:

答案 0 :(得分:1)

为了确保我理解,你想要删除超过2位小数的尾随0,并且可能有10位小数。

如果是这样,你非常接近,你可以通过简单的字符串格式调整一些东西来做到这一点。

d = Convert.ToDouble(s);
tb1 = (DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"];
tb1.Text = d.ToString("#,##0.00########");

此处格式#,##0.00########需要2位小数(由0表示),其余8位是可选的(由#表示)。

<强>实施例

Convert.ToDecimal("0.0000000000").ToString("#,##0.00########"); // 0.00
Convert.ToDecimal("4.2500000000").ToString("#,##0.00########"); // 4.25
Convert.ToDecimal("22,000,000.1234567890").ToString("#,##0.00########"); // 22,000,000.123456789
Convert.ToDecimal("22,000,000.1234567891").ToString("#,##0.00########"); // 22,000,000.1234567891

答案 1 :(得分:0)

感谢您的帮助。我能够修改你的建议,Kirk并添加额外的逻辑。我添加了另一个变量(d2)并插入了一个if语句,允许超过2个小数位,例如103.123456。请参阅以下内容:

public void Detail1_Format()
{ DataDynamics.ActiveReports.TextBox tb1;
String s;
Double d;
Decimal d2;
String ColName;
s = ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text;
ColName = ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtColName1"]).Text;
if((ColName == "Price" || ColName == "Original Face Value" || ColName == "Shares"))
{
    if(Double.TryParse(s, out d) == true)
    {
        d = Convert.ToDouble(s);
        tb1 = (DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"];
        d2 = Convert.ToDecimal(s);
        if((BitConverter.GetBytes(decimal.GetBits(d2)[3])[2]) > 2)
        {tb1.Text = d.ToString("#,##0.00########");}
        else 
        {tb1.Text = d.ToString("#,###.00");
        }
        ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text = tb1.Text;}
}
else {
    ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text = ((DataDynamics.ActiveReports.TextBox) rpt.Sections["Detail1"].Controls["txtValue1"]).Text;
}
}