在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。
答案 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.##";