截断尾随零datagridview列

时间:2015-01-09 13:21:41

标签: .net sql-server vb.net datagridview formatting

我使用windows datagridview从SQL中的订单商品表访问数据。

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

在datagridview上,我最初在十进制(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

我开始遇到绘制大型数据网格的性能问题。我正忙着阅读微软的最佳实践。

我试图看看是否有一种标准的方法,可能只是一个标准的DataGridViewCellStyle格式字符串。我打算创建一个变量来保存单元格样式并对其应用格式。

我可以使用“0.00 ###########################”但这不包括像£这样的文化特定的Money符号, $ etc

我希望我已经解释过了。

快速概览

如果价格是18.1234英镑,我希望看到18.1234英镑 如果价格是18.1230英镑,我希望看到18.1230英镑。 如果价格是18.1200英镑,我希望看到18.12英镑 如果价格是18.0000英镑,我希望看到18.00英镑

最重要的是,我希望文化符号具有文化特色。

我正在考虑将SQL数据类型更改为“money”,但如果它无法将十进制(18,4)与我们的报告系统中的钱联合起来,我可能会陷入一堆SQL Cast恶梦。

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

大卫。

2 个答案:

答案 0 :(得分:0)

你可以尝试:

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

如果您未指定文化,ToString将使用CurrentCulture

答案 1 :(得分:0)

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

在表单顶部声明符号以便于使用

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