Spanish Formato Fecha en EditText

Davidjimenez

New Member
Tengo un problema, necesito que mi aplicacion capture la fecha deseada, pero no encuentro la forma de aplicarle la mascara para fecha.

Muchas gracias, esperare ayuda.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Se hace con datetime.DateFormat

Saludos
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Hola

Se hace con datetime.DateFormat

Saludos

No se si mis necesidades son las mismas que las de @Davidjimenez cuando comenzó este hilo, pero yo entiendo que lo que el quiere/necesita (como yo) es ayuda para poder poner "máscara" de fecha en los editbox. Para poder introducir en ella fechas manualmente, y que sólo permita números y "/" ó "-".

¿Hay algo así de "soso"?. Ya se que hay muchos sistemas "visuales" para poder seleccionar fechas de calendarios, etc. Pero en el caso que me ocupa, se me puedan dar casos de tener fechas consecutivas de diferentes años y suele ser más rápido picarlas manualmente que a base de ir picando en un motón de sitios.

Gracias y un saludo.
 

cas6678

Active Member
Licensed User
Longtime User
Lo que tu quieres es mas complejo de lo que yo te voy a aportar, pero de momento si solo quieres que permita numeros...
B4X:
EditText.InputType=EditText.INPUT_TYPE_DECIMAL_NUMBERS

...y solo te abrira el teclado numerico.

Lo de separar con / , - , : etc. lo dejo para quien sepa mas.
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Gracias a @cas6678 y a @dar2o3, pero al final he tirado por la calle de en medio y me he hecho yo mismo un procedimiento para "enmascarar" las fechas.

Lo de:
Lo que tu quieres es mas complejo de lo que yo te voy a aportar, pero de momento si solo quieres que permita numeros...
B4X:
EditText.InputType=EditText.INPUT_TYPE_DECIMAL_NUMBERS

No me vale tal cual, ya que los de los números me viene bien, pero las barras y los guiones no los deja escribir, así que

Y lo de:

No me valió tampoco. Tenía un pinta magnífica pero supongo que sería cosa mía, pero no fui capaz de encontrar la forma de introducir sólo la fecha (sin horas) y que se comportara de una manera estable.

Para el que le pueda interesar me quedó así:
B4X:
' En el diseñador definir los EditText para las fechas con InputType = Numbers
' Y casi sería más interesante definir el mismo evento para todos, ya que luego gracias al Sender ya sabría realmente de que Editbox se trata en cada momento.
' En el ejemplo lo pongo por separado para que se vea que el mismo MascaraFecha me sirve para tantos EditText de tipo fecha como sea necesario.

Sub EditFCaducidad_TextChanged (Old As String, New As String)
    Dim Edit = Sender As EditText    
    MascaraFecha(Edit, Old, New)
End Sub

Sub EditFAlbaran_TextChanged (Old As String, New As String)
    Dim Edit = Sender As EditText    
    MascaraFecha(Edit, Old, New)
End Sub

Sub MascaraFecha(Edit As EditText, Old As String, New As String)
    Log("Old: " & Old & " - New: " & New)
    If (New.Length = 3) And (New.CharAt(2) <> "/") Then Edit.Text = Edit.text.SubString2(0,2) & "/" & New.CharAt(2)
    If (New.Length = 6) And (New.CharAt(5) <> "/") Then Edit.Text = Edit.text.SubString2(0,5) & "/" & New.CharAt(5)
    If (New.Length = 8) And (New.Length > Old.Length) Then 
        DateTime.DateFormat="dd/MM/yy"
        Dim DateAux = DateTime.DateParse(Edit.text) As Long 
        DateTime.DateFormat="dd/MM/yyyy"
        Edit.Text = DateTime.Date(DateAux)
    End If
    Edit.SelectionStart = Edit.Text.Length
End Sub
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Una nueva versión. Ahora ya no hace falta definir el EditText como de tipo numérico y ya permite introducir "/" y ademas controla si las fechas no son incorrectas y saca una aviso advirtiéndolo.

B4X:
Sub EditFCaducidad_TextChanged (Old As String, New As String)
    Dim Edit = Sender As EditText   
    MascaraFecha(Edit, Old, New)
End Sub

Sub EditFAlbaran_TextChanged (Old As String, New As String)
    Dim Edit = Sender As EditText   
    MascaraFecha(Edit, Old, New)
End Sub

Sub MascaraFecha(Edit As EditText, Old As String, New As String)
    Log("Old: " & Old & " - New: " & New)
    If New.Length > Old.Length And "01234567890/".IndexOf(New.CharAt(New.Length-1)) = -1 Then Edit.Text = Old
    If (New.Length = 3) And (New.CharAt(2) <> "/") Then Edit.Text = Edit.text.SubString2(0,2) & "/" & New.CharAt(2)
    If (New.Length = 6) And (New.CharAt(5) <> "/") Then Edit.Text = Edit.text.SubString2(0,5) & "/" & New.CharAt(5)
    If (New.Length = 8) And (New.Length > Old.Length) Then
        If IsValidDate(New) Then
                DateTime.DateFormat="dd/MM/yy"
                Dim DateAux = DateTime.DateParse(New) As Long
                DateTime.DateFormat="dd/MM/yyyy"
                Edit.Text = DateTime.Date(DateAux)
            Else
                Msgbox("Fecha incorrecta", "Aviso")
        End If
    End If
    Edit.SelectionStart = Edit.Text.Length
    ime1.SetCustomFilter(Edit, Edit.INPUT_TYPE_NUMBERS, "0123456789/")
End Sub

Sub IsValidDate(Date As String) As Boolean
    Try
        DateTime.DateParse(Date)
        Return True
    Catch
        Return False
    End Try
End Sub
 
Top