teclado numércio punto decimal

15/09/2005 - 06:08 por Juan Melas | Informe spam
Necesitaría que al ingresar el punto decimal en el teclado numérico lo
transforme a coma como la calculadora de windows cuando tengo configurado el
separador decimal como coma ya que a los usuarios les resulta más cómodo
cuando tienen que ingresar gran cantidad de datos numéricos.Hace poco
alguien paso un ejemplo pero no lo puedo encontrar.

Gracias

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua [mvp vb]
15/09/2005 - 16:20 | Informe spam
"Juan Melas" escribió en el mensaje
news:
Leonardo:ndl
Probé tu ejemplo, en este caso logro convertir el punto por
coma pero permite ingresar más de una coma, nose será posible hacer lo que
estoy intentando, ya que tengo una clase de textbox numérico que valida
diversas alternativas indendientemente de la configuración regional que
toma en la línea que transcribo abajo en este caso si pongo e.handled=true
no realiza la validación de algún modo deberé buscar la alternativa para
que detecte la configuración del separador decimal del equipo para
realizar la conversión del punto en coma y realizar la validación.



Hola, Juan:

Si te fijas en la conducta de Excel, en el momento en que incluyes un
segundo separador, el valor se convierte en alfanumerico.

La practica más frecuente funciona mas o menos así:

Cuando el control recibe el foco, el formato "externo" (#,###,##0.00, por
ejemplo) se convierte en un formato "simplificado" (#######0,00) [Text =
Str(Double.Parse(Text))]

Durante la edición, los únicos caracteres validos son el signo (solo en la
primera posicion), el separador decimal (que puede ser el punto, es un
separador universal al cual todos los usuarios están acostumbrados: de hecho
me molesta que Excel utilice la coma) y por supuesto los dígitos.

Puedes verificar que el punto sea único escribiendo (siempre en KeyPress):

If e.KeyChar = "." Then
If DirectCast(sender, TextBox).Text.IndexOf(".") >= 0 Then
' ya hay un punto
e.Handled = True
...

Una vez que tienes una cadena de numeros, opcionalmente precedida de un
signo y conteniendo un solo punto (.), puedes, en el evento Validating, o en
Leave, convertir la cadena a un número(mediante Val, que asume siempre el
formato interno, independiente de la configuracion regional -no se si hay un
metodo equivalente en C#), hacer lo que necesites con él, y darle el formato
requerido con Double.ToString(formato).

Casi todos los usuarios estamos acostumbrados a aceptar el punto como
separador decimal durante la edición de números.

Salud!
Respuesta Responder a este mensaje
#2 Pep
15/09/2005 - 17:26 | Informe spam
Vaya!! que verguenza!!

Gracias Leonardo, se me fue la version... cosa de la edad.. a veces sueño en
Quick Basic.

La idea en VB6 era cambiar el el caracter al valor del manipulador del
teclado, para que simulara que se habia pulsado esa tecla.
Lo que ocurre en Vb.NET es que el valor e.KeyChar es de solo lectura.
Permiteme ver como asignar el valor al manipulador.
No se si nuestro amigo Leonardo estara mas ducho que nosotros en el tema,
pues ahora que me doy cuenta, nunca he realizado esta tarea en VB 2003.

Os pido disculpas.
Pep,

[MVP] Visual Developer - Visual Basic


"Juan Melas" escribió:

Pep:
Estoy probando lo que me dices pero no me funciona , logro que pase el punto pero no lo convierte en coma, paso la parte del código que tengo en el keypress, la clase es más larga y realiza otras validaciones, no estoy seguro si con la línea que me pasaste el valor del carácter tipeado (".")se convierte en coma(",") o me está faltando hacer algo más.

Gracias


Private Sub SCKeyPress( _

ByVal eventSender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _

Handles MyBase.KeyPress


Dim KeyAscii As Integer = Convert.ToInt32(e.KeyChar)

If KeyAscii = 46 Then KeyAscii = 44



If KeyAscii = 8 Then

'>
' BackSpace

'>
'Dejemoslo hacer su trabajo

ElseIf KeyAscii = 3 Then

'>
' CTRL-C

'>
'Que pase, la validacion será hecha dentro del evento TextChanged

ElseIf KeyAscii = 22 Then

'>
' CTRL-V

'>
'Dejemoslo pasar, la validación será hecha dentro del método WndProc

ElseIf KeyAscii = 26 Then

'>
' CTRL-Z

'>
'Que pase

ElseIf e.KeyChar _

= System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator Then

'>
' Validation for .

'>
'E.Moreau 2003.11.02 - remueve el texto elegido desde la validación

Dim strText As String

If Me.SelectionLength > 0 Then

strtext = Me.Text.Replace(Me.SelectedText, "")

Else

strtext = Me.Text

End If

' Si todavia tenemos un punto, lo sacamos

If strText.IndexOf(",") >= 0 Then

SetError(enuErrors.ErrTooManyDot)

KeyAscii = 0

End If

' Si no tenemos decimales, lo sacamos

If Me.NumberDecimals = 0 Then

SetError(enuErrors.ErrDotNotAllowed)

KeyAscii = 0

End If

ElseIf e.KeyChar = "-" Then

'>
' Validation for -

'>
'E.Moreau 2003.11.02 - remueve el texto elegido desde la validación

Dim strText As String

If Me.SelectionLength > 0 Then

strtext = Me.Text.Replace(Me.SelectedText, "")

Else

strtext = Me.Text

End If

' El número puede tener solo un signo menos, entonces

' si ya tiene uno, lo sacamos

If strText.IndexOf("-") >= 0 Then

SetError(enuErrors.ErrTooManyMinusSign)

KeyAscii = 0

End If

' Si este punto de insersion no esta en cero

' (el cual está al comienzo del campo)

' sacamos el signo menos (porque no es

' valido, excepto en la primera posición)

If Me.SelectionStart <> 0 Then

SetError(enuErrors.ErrMinusSignMisplaced)

KeyAscii = 0

End If

' permitiremos numeros negativos?

If Me.ValueMin >= 0 Then

SetError(enuErrors.ErrNegativeNotAllowed)

KeyAscii = 0

End If

ElseIf e.KeyChar >= "0" And e.KeyChar <= "9" Then

'>
' Validación para numeros

'>
If Not ValidateKey() Then

'SetError(enuErrors.ErrInvalidChar)

KeyAscii = 0

End If

ElseIf e.KeyChar <> "." Then

SetError(enuErrors.ErrInvalidChar)

KeyAscii = 0

End If

If KeyAscii = 0 Then

e.Handled = True

End If

End Sub

"Pep" escribió en el mensaje news:
> Hola Juan,
> En la captura de teclas.. evento "KeyPress" que nos devuelve el Char en
> Ascii, entonces debes tratar los caracters 44 y 46 que corresponden al '.' y
> la ','. Es facil...
> If KeyAsciiD then KeyAsciiF
>
> Recuerdos,
> Pep,
>
> [MVP] Visual Developer - Visual Basic
>
>
> "Juan Melas" escribió:
>
>> Necesitaría que al ingresar el punto decimal en el teclado numérico lo
>> transforme a coma como la calculadora de windows cuando tengo configurado el
>> separador decimal como coma ya que a los usuarios les resulta más cómodo
>> cuando tienen que ingresar gran cantidad de datos numéricos.Hace poco
>> alguien paso un ejemplo pero no lo puedo encontrar.
>>
>> Gracias
>>
>>
>>
Respuesta Responder a este mensaje
#3 Leonardo Azpurua [mvp vb]
15/09/2005 - 18:16 | Informe spam
"Pep" escribió en el mensaje
news:
Vaya!! que verguenza!!

Gracias Leonardo, se me fue la version... cosa de la edad.. a veces sueño
en
Quick Basic.



Eso pasa. Si alguna vez tengo que hacer algo con C o PHP, luego me paso una
semana terminando las instrucciones de VB con punto y coma. Cosas de la
edad.

La idea en VB6 era cambiar el el caracter al valor del manipulador del
teclado, para que simulara que se habia pulsado esa tecla.



Y era de un práctico, pero ya nos lo quitaron (sigo sin entender muy bien
qué es lo que están haciendo: como dice Dan Barclay: "no van a parar hasta
que no hayan convertido a VB en Java").

Lo que ocurre en Vb.NET es que el valor e.KeyChar es de solo lectura.
Permiteme ver como asignar el valor al manipulador.
No se si nuestro amigo Leonardo estara mas ducho que nosotros en el tema,
pues ahora que me doy cuenta, nunca he realizado esta tarea en VB 2003.



Lo que se me ocurrió para reemplazar un caracter por otro (lo que haciamos
con KeyAscii = Reemplazo) es:

DirectCast(sender, TextBox).SelectedText = sReemplazo: este es el efecto que
produciría la tecla si no hicieramos nada, solo que la tecla es otra (el
DirectCast es uno de los precios que tenemos que pagar por el pecado de ser
suficientemente descuidados como para tener que trabajar con Strict On).

e.Handled = True: equivale al viejo KeyAscii = 0

Salud!
Respuesta Responder a este mensaje
#4 Pep
15/09/2005 - 18:17 | Informe spam
De nuevo,
Descargate este ejemplo :

http://www.gotdotnet.com/Community/...SampleGuid‘0038DF-D34A-4B10-B5AB-43A2ED566655

Aun y a pesar de estar en C#, creo que te servira para entender el concepto.
Si logro disponer de mas tiempo te mandare un ejemplo sencillo en VB.
Saludos,
Pep,

[MVP] Visual Developer - Visual Basic


"Juan Melas" escribió:

Pep:
Estoy probando lo que me dices pero no me funciona , logro que pase el punto pero no lo convierte en coma, paso la parte del código que tengo en el keypress, la clase es más larga y realiza otras validaciones, no estoy seguro si con la línea que me pasaste el valor del carácter tipeado (".")se convierte en coma(",") o me está faltando hacer algo más.

Gracias


Private Sub SCKeyPress( _

ByVal eventSender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _

Handles MyBase.KeyPress


Dim KeyAscii As Integer = Convert.ToInt32(e.KeyChar)

If KeyAscii = 46 Then KeyAscii = 44



If KeyAscii = 8 Then

'>
' BackSpace

'>
'Dejemoslo hacer su trabajo

ElseIf KeyAscii = 3 Then

'>
' CTRL-C

'>
'Que pase, la validacion será hecha dentro del evento TextChanged

ElseIf KeyAscii = 22 Then

'>
' CTRL-V

'>
'Dejemoslo pasar, la validación será hecha dentro del método WndProc

ElseIf KeyAscii = 26 Then

'>
' CTRL-Z

'>
'Que pase

ElseIf e.KeyChar _

= System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator Then

'>
' Validation for .

'>
'E.Moreau 2003.11.02 - remueve el texto elegido desde la validación

Dim strText As String

If Me.SelectionLength > 0 Then

strtext = Me.Text.Replace(Me.SelectedText, "")

Else

strtext = Me.Text

End If

' Si todavia tenemos un punto, lo sacamos

If strText.IndexOf(",") >= 0 Then

SetError(enuErrors.ErrTooManyDot)

KeyAscii = 0

End If

' Si no tenemos decimales, lo sacamos

If Me.NumberDecimals = 0 Then

SetError(enuErrors.ErrDotNotAllowed)

KeyAscii = 0

End If

ElseIf e.KeyChar = "-" Then

'>
' Validation for -

'>
'E.Moreau 2003.11.02 - remueve el texto elegido desde la validación

Dim strText As String

If Me.SelectionLength > 0 Then

strtext = Me.Text.Replace(Me.SelectedText, "")

Else

strtext = Me.Text

End If

' El número puede tener solo un signo menos, entonces

' si ya tiene uno, lo sacamos

If strText.IndexOf("-") >= 0 Then

SetError(enuErrors.ErrTooManyMinusSign)

KeyAscii = 0

End If

' Si este punto de insersion no esta en cero

' (el cual está al comienzo del campo)

' sacamos el signo menos (porque no es

' valido, excepto en la primera posición)

If Me.SelectionStart <> 0 Then

SetError(enuErrors.ErrMinusSignMisplaced)

KeyAscii = 0

End If

' permitiremos numeros negativos?

If Me.ValueMin >= 0 Then

SetError(enuErrors.ErrNegativeNotAllowed)

KeyAscii = 0

End If

ElseIf e.KeyChar >= "0" And e.KeyChar <= "9" Then

'>
' Validación para numeros

'>
If Not ValidateKey() Then

'SetError(enuErrors.ErrInvalidChar)

KeyAscii = 0

End If

ElseIf e.KeyChar <> "." Then

SetError(enuErrors.ErrInvalidChar)

KeyAscii = 0

End If

If KeyAscii = 0 Then

e.Handled = True

End If

End Sub

"Pep" escribió en el mensaje news:
> Hola Juan,
> En la captura de teclas.. evento "KeyPress" que nos devuelve el Char en
> Ascii, entonces debes tratar los caracters 44 y 46 que corresponden al '.' y
> la ','. Es facil...
> If KeyAsciiD then KeyAsciiF
>
> Recuerdos,
> Pep,
>
> [MVP] Visual Developer - Visual Basic
>
>
> "Juan Melas" escribió:
>
>> Necesitaría que al ingresar el punto decimal en el teclado numérico lo
>> transforme a coma como la calculadora de windows cuando tengo configurado el
>> separador decimal como coma ya que a los usuarios les resulta más cómodo
>> cuando tienen que ingresar gran cantidad de datos numéricos.Hace poco
>> alguien paso un ejemplo pero no lo puedo encontrar.
>>
>> Gracias
>>
>>
>>
Respuesta Responder a este mensaje
#5 Eduardo A. Morcillo [MS MVP VB]
16/09/2005 - 05:07 | Informe spam
Eso pasa. Si alguna vez tengo que hacer algo con C o PHP, luego me
paso una semana terminando las instrucciones de VB con punto y coma.
Cosas de la edad.



Y seguro que empiezas las funciones en C con "Sub" (a mi me pasa a veces).

La idea en VB6 era cambiar el el caracter al valor del manipulador
del teclado, para que simulara que se habia pulsado esa tecla.



Y era de un práctico, pero ya nos lo quitaron (sigo sin entender muy
bien qué es lo que están haciendo: como dice Dan Barclay: "no van a
parar hasta que no hayan convertido a VB en Java").



Eso no va a pasar nunca. Si lo van a convertir en algo va a ser en C# :-).
Algunos cambios de VB6 a VB.NET no tienen un porque razonable pero con otros
hay que tener en cuenta que se tendria que rehacer el runtime de vb6 sobre
el framework para mantener la compatibilidad y eso no tiene mucho sentido.

DirectCast(sender, TextBox).SelectedText = sReemplazo: este es el
efecto que produciría la tecla si no hicieramos nada, solo que la
tecla es otra (el DirectCast es uno de los precios que tenemos que
pagar por el pecado de ser suficientemente descuidados como para
tener que trabajar con Strict On).



No empecemos con esto del Strict otra vez!!! ;-)

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida