【问题标题】:VB.NET - DataGridView substring cell for Number(10,2)VB.NET - Number(10,2) 的 DataGridView 子字符串单元格
【发布时间】:2016-02-05 10:12:56
【问题描述】:

我有一个 DataGridView,其中有一列用户可以插入双精度。在我插入数据库之前,我必须控制单元格的值,因为该表具有该字段的 number(10,2) 数据类型。

我当前的代码:

Dim length As Integer = Nothing    
Dim row As Integer = DTG.CurrentCell.RowIndex
Dim column As Integer = DTG.CurrentCell.ColumnIndex()

With DTG(row).Cells(column)
    length = Len(.Value)
    If Not IsNothing(.Value) Then
            If Not IsNumeric(.Value) Then
                    .Value = 0
            End If

            If length > 10 Then
                    .Value = .Value.SubString(0, 10)
                    If .Value.Contains(".") Then
                        .Value = .Value.SubString(0, 9)
                    End If
            End If
    End If
End With

这里不适合使用length方法,因为如果我的单元格中包含“.”,长度会增加。

示例:

1234567891 => length = 10 => insert : 1234567891

123456789.1 => length = 11 => insert : 123456789

在第二种情况下,我需要插入123456789.1

有人可以给我建议吗?谢谢

【问题讨论】:

    标签: vb.net datagridview substring variable-length


    【解决方案1】:

    您可以使用.Value.IndexOf(".") 获取小数点分隔符前的位数(

    【讨论】:

    • .value 是否有类似的工作,包括小数点分隔符后的数字?
    • 分隔符后的位数:Len(.Value) - .Value.IndexOf(".") - 1。当然,这只有在.Value.Contains(".") 为真时才有效。
    • 我认为有更好的方法可以做到这一点,我会继续搜索。
    【解决方案2】:

    如果我没记错的话,数据类型为number(10,2) 的数据库字段意味着它可以携带最大值99999999.99,使用这个你可能会改变你的代码看起来像

    Dim dbMaxNum As Decimal = 99999999.99
    
    With DTG(row).Cells(column)
        If Not IsNothing(.Value) Then
            If Not IsNumeric(.Value) Then 
                .Value = 0
            Else
                .Value = Math.Min( _
                            dbMaxNum, _
                            Math.Round(CDec(.Value), 2, MidpointRounding.AwayFromZero))
            End If
        End If
    End With
    

    我们首先将.Value 舍入到小数点后两位,然后选择结果与数据库字段可以容纳的最大值之间的最小值 (99999999.99)

    MidpointRounding.AwayFromZero 选项用于防止意外的舍入结果,例如 32.625 舍入为 32.62this question 中提出的问题)。

    【讨论】:

    • 阅读oracle 文档中的数字数据类型部分。带有 NUMBER(9,2) 的 7,456,123.89 存储为 7456123.89
    • 我没有看到我所说的任何内容都不正确,你在暗示什么?文档说数据类型 NUMBER(10,2) 最多可以容纳 10 位数字,但其中 2 位保留给小数部分(这意味着 数字部分 不能超过 8 位),因此可以容纳的最大数量是99999999.99。在您的两个示例中,您都尝试插入大于 99999999.99 的数字。
    【解决方案3】:

    我最终决定使用单元格值。

    If .Value > 99999999.99 Then
        .Value = Convert.ToDouble(.Value.SubString(0, 8))
    End If
    

    我把样式格式改成“N2”,所以用户不能写超过2位小数:

    .ValueType = GetType(Double)
    .Style.Format = "N2"
    

    我还找到了另一种方法,我可以像屏蔽文本框一样格式化我的列。我稍后会尝试这个解决方案。

    编辑: 以前的答案很糟糕,但它帮助了我一段时间。我找到了一种更好的方法来处理我的问题。我创建了一个检查小数点前位数的函数,如果长度大于8,则返回False

    Public Function numberDigitsBeforeDecimal(ByVal montant As Double) As Boolean
        Dim beforeDigit As String = montant.ToString.Substring(0, montant.ToString.IndexOf("."))
    
        If beforeDigit.Length > 8 Then
            Return False
        Else
            Return True
        End If
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多