APENAS DOIS NÊMEROS APÓS A VÃRGULA
Estou com um problema em um textbox. Eu bloquei no evento Keypress apenas para digitar números e o caractere vÃrgula. Porém há um erro na minha aplicação em que eu não posso dexar digtar vÃrgula no inÃcio do campo, apenas após a digitaçaõ do número. Também quero que após a digitação da virgula, sejam digitados apenas dois números ou quantos em quiser configuar.
Como proceder?
Veja.
https://sites.google.com/site/programacaoonline/family-blog/vb-net/textbox-com-mascara-moeda-em-vb-net
Private Sub TXTNOTA1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TXTNOTA1.KeyPress
If Not Char.IsNumber(e.KeyChar) And Not e.KeyChar = Convert.ToChar(Keys.Back) And Not e.KeyChar = [Ô],[Ô] Then
e.Handled = True
End If
If e.KeyChar = [Ô],[Ô] And InStr(TXTNOTA1.Text, [Ô],[Ô]) > 0 Then
e.Handled = True
End If
End Sub
Mesmo assim obrigado pela ajuda.
Const Numeros As String = [Ô]012345,6789[Ô]
SoNumeros = Key
If Key <> 8 Then
If InStr(Numeros, Chr(Key)) = 0 Then
SoNumeros = 0
End If
End If
End Function
[ô]*********************************
Dim sQtdeVirgulas As Object
Private Sub TXT_CUSTO_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TXT_CUSTO.KeyPress
Dim KeyAscii As Short = Asc(e.KeyChar)
KeyAscii = SoNumeros(KeyAscii)
e.KeyChar = Chr(KeyAscii)
If KeyAscii = 0 Then
e.Handled = True
End If
sQtdeVirgulas = Split(TXT_CUSTO.Text, [Ô],[Ô])
If UBound(sQtdeVirgulas) = 1 Then
If KeyAscii = 44 Or KeyAscii = 46 Then
MsgBox([Ô]ERRO DE DIGITAÇÃO[Ô], MsgBoxStyle.Critical, [Ô]ERRO[Ô])
KeyAscii = 0
End If
End If
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 46 And KeyAscii <> 44 And KeyAscii <> 13 And KeyAscii <> 8 Then KeyAscii = 0
e.KeyChar = Chr(KeyAscii)
If KeyAscii = 0 Then
e.Handled = True
End If
End Sub
Citação::
Public Function SoNumeros(ByRef Key As Short) As Short
Const Numeros As String = [Ô]012345,6789[Ô]
SoNumeros = Key
If Key <> 8 Then
If InStr(Numeros, Chr(Key)) = 0 Then
SoNumeros = 0
End If
End If
End Function
[ô]*********************************
Dim sQtdeVirgulas As Object
Private Sub TXT_CUSTO_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TXT_CUSTO.KeyPress
Dim KeyAscii As Short = Asc(e.KeyChar)
KeyAscii = SoNumeros(KeyAscii)
e.KeyChar = Chr(KeyAscii)
If KeyAscii = 0 Then
e.Handled = True
End If
sQtdeVirgulas = Split(TXT_CUSTO.Text, [Ô],[Ô])
If UBound(sQtdeVirgulas) = 1 Then
If KeyAscii = 44 Or KeyAscii = 46 Then
MsgBox([Ô]ERRO DE DIGITAÇÃO[Ô], MsgBoxStyle.Critical, [Ô]ERRO[Ô])
KeyAscii = 0
End If
End If
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 46 And KeyAscii <> 44 And KeyAscii <> 13 And KeyAscii <> 8 Then KeyAscii = 0
e.KeyChar = Chr(KeyAscii)
If KeyAscii = 0 Then
e.Handled = True
End If
End Sub
Olá, obrigado pela resposta.
Seu código faz exatamente a mesma coisa que o meu código acima, porém em ambos casos, há uma falha que permite digitar a vÃrgula no começo do textbox sem ter nenhum número preenchido e também não trava em dois números digitados após a vÃrgula.
Entendo assim se o usuário digitar a virgula primeiro eu colocaria um número zero na frente, pois até mesmo se você ver uma calculadora permite isso!
Então vamos tratar:
A virgula como primeiro carácter;
O backspace;
O carácter vÃrgula e somente números digitados;
No KeyPress do TextBox coloque o código abaixo?
[ô]Verificar se esta digitando somente núemros / BackSpace / VÃrgula
If Not Char.IsDigit(e.KeyChar) And Not e.KeyChar.Equals(Chr(Keys.Back)) And Not e.KeyChar = [Ô],[Ô] Then
e.Handled = True
End If
[ô]Verificar se a tecla não é BackSpace e seja VÃrgula, porém que não contenha uma vÃrgula digitada
If Not e.KeyChar.Equals(Chr(Keys.Back)) And e.KeyChar = [Ô],[Ô] And TextBox1.Text.Contains([Ô],[Ô]) Then
e.Handled = True
End If
[ô]Verificar se a vÃrgula é o primeira carácter e coloca o zero na frente
If Not e.KeyChar.Equals(Chr(Keys.Back)) And e.KeyChar = [Ô],[Ô] And TextBox1.TextLength = 0 Then
TextBox1.Text = [Ô]0,[Ô]
TextBox1.Select(TextBox1.TextLength, 0)
e.Handled = True
End If
Portanto o resto da tratativa fica por conta sua!
Espero ter ajudado!
Citação::
Bom vamos lá!
Entendo assim se o usuário digitar a virgula primeiro eu colocaria um número zero na frente, pois até mesmo se você ver uma calculadora permite isso!
Então vamos tratar:
A virgula como primeiro carácter;
O backspace;
O carácter vÃrgula e somente números digitados;
No KeyPress do TextBox coloque o código abaixo?[ô]Verificar se esta digitando somente núemros / BackSpace / VÃrgula
If Not Char.IsDigit(e.KeyChar) And Not e.KeyChar.Equals(Chr(Keys.Back)) And Not e.KeyChar = [Ô],[Ô] Then
e.Handled = True
End If
[ô]Verificar se a tecla não é BackSpace e seja VÃrgula, porém que não contenha uma vÃrgula digitada
If Not e.KeyChar.Equals(Chr(Keys.Back)) And e.KeyChar = [Ô],[Ô] And TextBox1.Text.Contains([Ô],[Ô]) Then
e.Handled = True
End If
[ô]Verificar se a vÃrgula é o primeira carácter e coloca o zero na frente
If Not e.KeyChar.Equals(Chr(Keys.Back)) And e.KeyChar = [Ô],[Ô] And TextBox1.TextLength = 0 Then
TextBox1.Text = [Ô]0,[Ô]
TextBox1.Select(TextBox1.TextLength, 0)
e.Handled = True
End If
Portanto o resto da tratativa fica por conta sua!
Espero ter ajudado!
Olá Filman. Anexei apenas a última parte no código, obrigado pela dica do zero. Por falar nele como eu faria para colocar apenas dois números após a vÃrgula?
você pode fazer assim:
If Not e.KeyChar.Equals(Chr(Keys.Back)) And TextBox1.Text.Contains([Ô],[Ô]) Then
Dim count As String() = TextBox1.Text.Split([Ô],[Ô])
If count(1).Length = 2 Then
e.Handled = True
End If
End If
Obrigado