VB.NET - ячейка подстроки DataGridView для Number(10,2)

У меня есть DataGridView с колонкой, где пользователь может вставить двойной. Я должен контролировать значение ячейки, прежде чем вставлять в свою базу данных, потому что таблица имеет тип данных число (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

Метод длины здесь не подходит, потому что, если моя ячейка содержит ".", Длина увеличивается.

Примеры:

1234567891 => length = 10 => insert : 1234567891

123456789.1 => length = 11 => insert : 123456789

Во втором случае мне нужно вставить 123456789.1

Может кто-нибудь посоветовать мне? Спасибо

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

Если я не ошибаюсь, поле базы данных с типом данных 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.62 (проблема, поднятая в этом вопросе).

Ты можешь использовать .Value.IndexOf(".") получить количество цифр перед десятичным разделителем (<= 10).

Другие вопросы по тегам