避免在Datagridview控件中舍入小数

时间:2014-07-22 11:05:53

标签: c# winforms datagridview c#-3.0

在Datagridview中,我有一列" C" ,它是列" A" &的产品#34; B" 即可。 例 A栏价值 - 8.14 B栏值 - 0.2  现在C列值 12.296 ,小数点后我想显示前两个数字 12.29 ,没有四舍五入 12.30

以下是我用来实现上述结果的代码。

public class CustomFormatter : IFormatProvider, ICustomFormatter
{

    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
            return this;
        else
            return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        // Check whether this is an appropriate callback             
        if (!this.Equals(formatProvider))
            return null;

        if (arg == null) return null;

        string numericString = arg.ToString();

        decimal result = 0;

        if (Decimal.TryParse(numericString, out result))
        {
            return ((Math.Truncate(result * 100)) / 100).ToString();
        }
        else
        {
            return null;
        }
    }
}

private void gvItemDetails_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    try
    {
        if (e.ColumnIndex == gvItemDetails.Columns["Vat Amount"].Index)
        {
            gvItemDetails[e.ColumnIndex, e.RowIndex].Value = String.Format(new CustomFormatter(), "{0}", e.Value);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

当我在cellformatting代码上放置一个断点时,我可以看到代码不断重复,但没有返回任何stackoverflow异常。当我删除它的工作断点。

请问你可以提出什么问题的建议,或建议任何其他替代措施,以防止它绕过节目12.29而不是12.30。

谢谢, Prathap。

1 个答案:

答案 0 :(得分:1)

首先,我尝试使用您使用的相同方法。它对我来说非常好,可以产生所需的" 12.29"。

string numericString = "12.2963";
string truncatedString = string.Empty;
decimal result = 0;

if (Decimal.TryParse(numericString, out result))
{
     truncatedString = ((Math.Truncate(result * 100)) / 100).ToString();
}

如果上面的方法不适合你,另一个简单的替代方法是使用string.substring(这仅在你不需要中间十进制值时才有用)。

string numericString = "12.2963";
string truncatedString = string.Empty;value
int endIndex = numericString.IndexOf('.');
truncatedString = numericString.Substring(0, endIndex + 3);

更新

虽然我还没有对其进行测试,但您应该能够以这种方式定义格式提供程序:

this.dataGridView1.Columns["XYZ"].DefaultCellStyle.FormatProvider = new CustomFormatter();

和格式(此处格式字符串将具有预定义含义):

this.dataGridView1.Columns["XYZ"].DefaultCellStyle.Format = "c"; 

更新2: 不幸的是,即使你使用的是FormatProvider,你仍然需要处理cellformatting事件; Check This

好消息是,您不需要使用FormatProvider。请尝试以下格式,它应该适合您:

this.dataGridView1.Columns["XYZ"].DefaultCellStyle.Format = "0.##";