Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Karcrack en 30 Agosto 2010, 22:23 pm



Título: [RETO] Entero a cadena
Publicado por: Karcrack en 30 Agosto 2010, 22:23 pm
No os parece que ha pasado muchisimo desde el ultimo reto? :rolleyes: :xD

Pues este es bien simple... la forma mas rapida de pasar de numero a cadena...

Ej:
Código:
1337 -> "1337"

Por asi decirlo es un reemplazo a Str()

Ha de recibir Long y devolver String.
Ha de aceptar numeros negativos.

Venga, a codear!


Título: Re: [RETO] Entero a cadena
Publicado por: Karcrack en 30 Agosto 2010, 22:33 pm
Aqui esta, como siempre, la forma logica:
Código
  1. Public Function ItoA01(ByVal lNumb As Long) As String
  2.    ItoA01 = Str$(lNumb)
  3. End Function


Título: Re: [RETO] Entero a cadena
Publicado por: Psyke1 en 30 Agosto 2010, 23:02 pm
Mira el mio:
Código
  1. Public Function ItoA02(ByVal lNumber As Long) As String
  2.    ItoA02 = CStr(lNumber)
  3. End Function
:xD :xD :laugh: :laugh:

PD: Si soy sincero no se ni por donde empezar... :-( :silbar:

DoEvents¡! :P


Título: Re: [RETO] Entero a cadena
Publicado por: raul338 en 30 Agosto 2010, 23:03 pm
Pues la verdad dudo que se pueda hacer una funcion taan rapida como la CStr o Str$... pero bueno, ya hare la mia :P


Título: Re: [RETO] Entero a cadena
Publicado por: Karcrack en 30 Agosto 2010, 23:09 pm
Este es mi primer intento, no es mas rapido que CStr() ni Str(), pero he tenido una idea a ver si me sale, luego intento >:D
Código
  1. Public Static Function ItoA02(ByVal lNumb As Long) As String
  2.    Dim sTable(9)   As String
  3.    Dim b           As Boolean
  4.    Dim x           As Boolean
  5.  
  6.    x = CBool(lNumb And &H80000000)
  7.    If x Then lNumb = (lNumb Xor x) - x
  8.  
  9.    If b = False Then
  10.        sTable(0) = "0":        sTable(1) = "1"
  11.        sTable(2) = "2":        sTable(3) = "3"
  12.        sTable(4) = "4":        sTable(5) = "5"
  13.        sTable(6) = "6":        sTable(7) = "7"
  14.        sTable(8) = "8":        sTable(9) = "9"
  15.        b = True
  16.    End If
  17.    Do
  18.        ItoA02 = sTable(lNumb Mod 10) & ItoA02
  19.        lNumb = lNumb \ 10
  20.    Loop While lNumb
  21.  
  22.    If x Then x = False: ItoA02 = "-" & ItoA02
  23. End Function


Título: Re: [RETO] Entero a cadena
Publicado por: Karcrack en 30 Agosto 2010, 23:28 pm
Código
  1. Public Function ItoA03(ByVal lNumb As Long) As String
  2.    Dim bvRet(10)   As Byte
  3.    Dim i           As Long
  4.    Dim b           As Boolean
  5.  
  6.    b = lNumb < 0
  7.    If b Then lNumb = -lNumb
  8.  
  9.    i = 10
  10.  
  11.    Do
  12.        bvRet(i) = 48 + (lNumb Mod 10)
  13.        lNumb = lNumb \ 10
  14.        i = i - 1
  15.    Loop While lNumb
  16.  
  17.    If b Then bvRet(i) = 45
  18.  
  19.    ItoA03 = SysAllocStringLen(bvRet(i), 10 - i)
  20. End Function
Código:
http://www.xbeat.net/vbspeed/download/TLB_string.zip

Mas rapido que Str(), pero no mas que CStr() :-\


Título: Re: [RETO] Entero a cadena
Publicado por: LeandroA en 30 Agosto 2010, 23:37 pm
Hola y no es valido asi?

Código:
Private Function ItoA03(lNumb As Long) As String
    ItoA03 = lNumb
End Function




Título: Re: [RETO] Entero a cadena
Publicado por: Psyke1 en 30 Agosto 2010, 23:39 pm
Hola y no es valido asi?

Código:
Private Function ItoA03(lNumb As Long) As String
    ItoA03 = lNumb
End Function
Jajajajajajaja :xD
Aun mas rapido que el mio!!

LeandroA > PsYkE1 > Karcrack
 :laugh:

DoEvents¡! :P


Título: Re: [RETO] Entero a cadena
Publicado por: raul338 en 30 Agosto 2010, 23:43 pm
Naaa karcrack, yo tenia una idea parecida, pero me tuve que ir :¬¬ aver...si se me ocurre algo.....


Título: Re: [RETO] Entero a cadena
Publicado por: Karcrack en 30 Agosto 2010, 23:50 pm
Hola y no es valido asi?

Código:
Private Function ItoA03(lNumb As Long) As String
    ItoA03 = lNumb
End Function
No, no vale :¬¬ :¬¬ Eso es trampa! :xD No se porque pero cuando yo lo prove era mas lento :¬¬
Ale, pues otra cosa mas a la que superar :laugh:

MOD: Hace lo mismo que CStr internamente, asi que realmente es lo mismo :P


Título: Re: [RETO] Entero a cadena
Publicado por: Karcrack en 31 Agosto 2010, 00:22 am
 ::) ::)
Código
  1. Public Function ItoA05(ByVal lNumb As Long) As String
  2.    Call VarBstrFromI4(lNumb, 0, 0, ItoA05)
  3. End Function
Código:
http://www.box.net/shared/51biuct9cd

Creo que mas rapido o corto imposible :P

Saludos :D


Título: Re: [RETO] Entero a cadena
Publicado por: raul338 en 31 Agosto 2010, 00:37 am
Esto se llama perder el tiempo reiventando el casting :xD

Código
  1. Public Function StrRaul01(ByVal Number As Long) As String
  2.    If Number And &H80000000 Then
  3.        StrRaul01 = "-"
  4.        Number = Number * -1
  5.    End If
  6.    If Number = 0 Then StrRaul01 = "0": Exit Function
  7.    If Number = 1 Then StrRaul01 = "1": Exit Function
  8.  
  9.    Dim i As Byte
  10.    Do While True
  11.        i = Fix(Number Mod 10)
  12.        Select Case i
  13.            Case 1: StrRaul01 = StrRaul01 & "1"
  14.            Case 2: StrRaul01 = StrRaul01 & "2"
  15.            Case 3: StrRaul01 = StrRaul01 & "3"
  16.            Case 4: StrRaul01 = StrRaul01 & "4"
  17.            Case 5: StrRaul01 = StrRaul01 & "5"
  18.            Case 6: StrRaul01 = StrRaul01 & "6"
  19.            Case 7: StrRaul01 = StrRaul01 & "7"
  20.            Case 8: StrRaul01 = StrRaul01 & "8"
  21.            Case 9: StrRaul01 = StrRaul01 & "9"
  22.            Case 0: StrRaul01 = StrRaul01 & "0"
  23.        End Select
  24.        Select Case Number
  25.            Case Is > 10: Number = Number \ 10
  26.            Case Is = 10
  27.                StrRaul01 = StrRaul01 & "10"
  28.                GoTo Final
  29.            Case Is < 10
  30.                GoTo Final
  31.        End Select
  32.    Loop
  33. Final:
  34.    StrRaul01 = StrReverse(StrRaul01)
  35.    Dim s As String
  36.    Dim t As Integer
  37.    Dim l As Integer
  38.    t = 1
  39.    l = Len(StrRaul01)
  40.    If l = 1 Then Exit Function
  41.    For i = 1 To l
  42.        If Mid$(StrRaul01, i, 1) = "0" Then
  43.            t = t + 1
  44.        Else
  45.            StrRaul01 = Mid(StrRaul01, t)
  46.            Exit Function
  47.        End If
  48.    Next
  49. End Function
  50.  

Al menos es mas rapido que el primer intento de karcrack xDDD
Voy a ver si logro agilizarlo


Título: Re: [RETO] Entero a cadena
Publicado por: BlackZeroX en 1 Septiembre 2010, 06:31 am
.
Para mi LeandroA gano!¡.

P.D.: solo postee para decir, Que ojasos el de tu Gallo xP

Dulces Lunas!¡.


Título: Re: [RETO] Entero a cadena
Publicado por: MCKSys Argentina en 1 Septiembre 2010, 19:43 pm
@Karcrack: Lo de LeandroA es lo que se conoce como "evil type convertion" (lo que salto en el otro post)

Por las dudas, pongo el mio, aunque es muy parecido:
Código:
Private Function ItoA03(lNumb As Long) As String
    ItoA03 = "" & lNumb
End Function


Título: Re: [RETO] Entero a cadena
Publicado por: ignorantev1.1 en 1 Septiembre 2010, 20:17 pm
Una duda:

Como mido el tiempo?


Título: Re: [RETO] Entero a cadena
Publicado por: Psyke1 en 1 Septiembre 2010, 20:24 pm
Una duda:

Como mido el tiempo?

Con:

cTiming.cls (http://www.xbeat.net/vbspeed/download/CTiming.zip)

o con:

Código
  1. Private Declare Function GetTickCount Lib "kernel32" () As Long

DoEvents¡! :P


Título: Re: [RETO] Entero a cadena
Publicado por: ignorantev1.1 en 1 Septiembre 2010, 20:27 pm
Pues si use el mentado "GetTickCount" pero me da 0, a lo mejor lo estoy haciendo mal, por eso pregunte:

dim x as long
x=GetTickCount
****llamo funcion****
msgbox GetTickCount-x


Título: Re: [RETO] Entero a cadena
Publicado por: Psyke1 en 1 Septiembre 2010, 21:34 pm
Un ej:

Código
  1. Option Explicit
  2. Private Declare Function GetTickCount Lib "kernel32" () As Long
  3.  
  4. Private Sub Form_Load()
  5.    Dim t1 As Long
  6.    Dim t2 As Long
  7.  
  8.    t1 = GetTickCount '1ª marca
  9.  
  10.    'Call Function
  11.  
  12.    t2 = GetTickCount '2ª marca
  13.  
  14.    MsgBox t2 - t1    'Resultado = diferencia entre marcas.
  15.  
  16. End Sub

DoEvents¡! :P


Título: Re: [RETO] Entero a cadena
Publicado por: ignorantev1.1 en 1 Septiembre 2010, 21:45 pm
Código
  1. Option Explicit
  2. Private Declare Function GetTickCount Lib "kernel32" () As Long
  3.  
  4. Private Sub Form_Load()
  5.    Dim t1 As Long
  6.    Dim t2 As Long
  7.  
  8.    t1 = GetTickCount '1ª marca
  9.  
  10.    Me.Print StrRaul01(-99999)
  11.    t2 = GetTickCount '2ª marca
  12.  
  13.    MsgBox t2 - t1    'Resultado = diferencia entre marcas.
  14.  
  15. End Sub

Renuncio! siempre me da 0...


Título: Re: [RETO] Entero a cadena
Publicado por: Psyke1 en 1 Septiembre 2010, 21:55 pm
Ah, es que es tan poco tiempo que no se aprecia con GetTickCount... :silbar:
Mira prueba con cTiming.cls (http://www.xbeat.net/vbspeed/download/CTiming.zip) :

Un ej:

Código
  1. Option Explicit
  2.  
  3. Dim tmr As CTiming
  4.  
  5. Private Sub Form_Load()
  6.    Set tmr = New CTiming
  7.  
  8.    tmr.Reset
  9.  
  10.    Debug.Print StrRaul01(-99999)
  11.  
  12.    MsgBox tmr.Elapsed
  13.  
  14. End Sub

Resultado:
Citar
0,28903007248116

Ahora si... :xD

DoEvents¡! :P