截断尾随零 datagridview 列

Posted

技术标签:

【中文标题】截断尾随零 datagridview 列【英文标题】:Truncate trailing zeros datagridview column 【发布时间】:2015-01-09 13:21:40 【问题描述】:

我使用 Windows 数据网格视图从 SQL 中的订单项表中访问数据。

我在 SQL 中将商品的价格存储为十进制(18,4)

在datagridview上我原来在decimal(18,4)上使用了C4的格式字符串

这很好,但是如果价格只是 18.12 英镑,它会在价格上显示额外的零,它会显示为 18.1200 英镑,但如果价格是 18.1234 英镑,那么我想看到 18.1234 英镑。一个重要的注意事项是,我希望 £ 符号是特定于文化的。因为我住在英国,所以它的英镑,如果美国用户使用该系统,它需要是 $ 等等

我解决这个问题的方法是像这样处理 datagridview 上的单元格格式化事件

    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 数据类型更改为“金钱”,但如果它无法将小数 (18,4) 与我们报告系统上的金钱结合起来,我可能会陷入一大堆 SQL Cast 噩梦。

任何想法或建议都会有所帮助,在此先感谢。

大卫。

【问题讨论】:

你试过d.ToString("C4", New System.Globalization.CultureInfo("en-GB"))吗? 我试试,看代码担心18.0000还是18.0000 【参考方案1】:

你可以试试:

Public Shared Function RemoveTrailingZerosForCurrency(ByVal d As Decimal) As String
    Return d.ToString("C4").Replace("00", "")
End Function

因为如果您不指定文化,ToString 将使用 CurrentCulture

【讨论】:

这是否意味着真的没有格式字符串可以做到这一点,而无需像我已经在做的那样手动拦截 CellFormattingEvent?这比我所拥有的要好一些。我想如果我 Dim 类型为 DataGridViewCellStyle 的变量,然后设置 d.ToString("C4").Replace("00", "") 的格式,然后将其应用于相关列,这可能会提高性能,因为我不干扰单元格格式化事件中的每个单元格样式。 (我担心你提出的这个解决方案可能会用 18.45 替换 1800.4500 虽然看着它。谢谢。 这不会引入将 12.0034 替换为 12.34 的风险吗?【参考方案2】:

我最终在表单中创建了默认单元格样式变量,并将样式分配给需要相同类型的多个列。我相信这应该会提高性能。

在表格顶部声明一个符号以便于使用

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

【讨论】:

以上是关于截断尾随零 datagridview 列的主要内容,如果未能解决你的问题,请参考以下文章

没有尾随零的 PHP 数量格式

删除小数点雪花后的尾随零

错误 C2026:字符串太大,尾随字符被截断

如何保留 perl 变量的尾随空格?

DataGridView显示日期格式问题

BackgroundWorker 填充 DataGridView