.net 截断尾随零datagridview列
我使用windows datagridview从SQL中的order items表访问数据 在SQL中,我将项目的价格存储为小数18,4 在datagridview上,我最初在小数点18,4上使用了C4格式字符串 这很好,但它在价格上显示了额外的零,例如,如果价格是18.12英镑,它将显示为18.1200英镑,但如果价格是18.1234英镑,那么我希望看到18.1234英镑。一个重要的注意事项是,我希望标志是特定于文化的。因为我住在英国,如果一个美国用户使用这个系统,它需要$etc 我解决这个问题的方法是像这样处理datagridview上的单元格格式化事件.net 截断尾随零datagridview列,.net,sql-server,vb.net,datagridview,formatting,.net,Sql Server,Vb.net,Datagridview,Formatting,我使用windows datagridview从SQL中的order items表访问数据 在SQL中,我将项目的价格存储为小数18,4 在datagridview上,我最初在小数点18,4上使用了C4格式字符串 这很好,但它在价格上显示了额外的零,例如,如果价格是18.12英镑,它将显示为18.1200英镑,但如果价格是18.1234英镑,那么我希望看到18.1234英镑。一个重要的注意事项是,我希望标志是特定于文化的。因为我住在英国,如果一个美国用户使用这个系统,它需要$etc 我解决这个问
Private Sub gridOrderItems_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles gridOrderItems.CellFormatting
If Me.gridOrderItems.Rows.Count > 0 Then
Dim dr As DataGridViewRow = Me.gridOrderItems.Rows(e.RowIndex)
If e.ColumnIndex = Me.gridOrderItems.Columns("priceColumn").Index Then
e.Value = USEFUL.RemoveTrailingZerosForCurrency(e.Value)
End If
End If
End Sub
Public Shared Function RemoveTrailingZerosForCurrency(ByVal d As Decimal) As String
Dim s As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
Return d.ToString(s & "0.00###########################")
End Function
不过,在绘制大型数据网格时,我开始遇到性能问题。我正忙于阅读Microsoft最佳实践
我试图看看是否有一种标准的方法,可以只使用一个标准的DataGridViewCellStyle格式字符串。我打算创建一个变量来保存单元格样式并对其应用格式
我可以使用0.00,但不包括特定于文化的货币符号,如:,$等
我希望我已经解释清楚了
快速概述
如果价格是18.1234英镑,我想看看18.1234英镑
如果价格是18.1230英镑,我希望看到18.1230英镑的原价。
如果价格是18.1200英镑,我想看看18.12英镑
如果价格是18.0000英镑,我想看到18.00英镑
最重要的是,我希望文化符号是特定于文化的
我曾考虑将SQL数据类型更改为money,但如果在我们的报告系统上不能将小数18,4合并为money,我可能会陷入一大堆SQL Cast噩梦
任何想法或建议都会有帮助,提前谢谢
大卫。你可以试试:
Public Shared Function RemoveTrailingZerosForCurrency(ByVal d As Decimal) As String
Return d.ToString("C4").Replace("00", "")
End Function
因为如果不指定区域性,ToString将使用。我最终在表单中创建了默认单元格样式变量,并为需要相同类型的多个列指定了样式。我相信这应该会加快表现 在表单顶部声明一个易于使用的符号
Private symbol As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
然后尽可能早地调用它,您可以在表单加载中执行,但我正在调查在网格实际绘制之前是否有更早更好的时间
blackDefaultCellStyle = New DataGridViewCellStyle
blackDefaultCellStyle = Me.gridOrderItems.DefaultCellStyle.Clone()
blackDefaultCellStyle.Format = symbol & "0.00###########################"
现在我只需将列指定给单元格样式,如下所示:
Me.gridOrderItems.Columns("DailypriceDataGridViewTextBoxColumn").DefaultCellStyle = blackDefaultCellStyle
你试过d.ToStringC4,New System.Globalization.cultureInfo-GB吗?我会试一下,我担心18.0000仍然是18.0000,通过查看代码,这是否意味着没有真正的格式字符串可以做到这一点,而不需要像我已经做的那样手动截取CellFormattingEvent?这比我的稍微好一点。我在想,如果我调暗DataGridViewCellStyle类型的变量,然后设置d.ToStringC4.Replace00的格式,然后将其应用于相关列,可能会提高性能,因为我不会干扰单元格格式化事件中的每个单元格样式。我担心您提出的这个解决方案可能会将1800.4500替换为18.45。谢谢。这不会带来用12.34替换12.0034的风险吗?