Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: lucius en Enero 12, 2011, 03:39:58 pm

Título: Obtener solo los numeros de un string
Publicado por: lucius en Enero 12, 2011, 03:39:58 pm
Digamos que tengo esta cadena 452FH3.34-F0 como recuperaria solo los numeros osea 4523340, que funcion debo utilizar.
Título: Re:Obtener solo los numeros de un string
Publicado por: wolf_kof en Enero 12, 2011, 03:52:02 pm
es facil

Código: (vb) [Seleccionar]

dim Vi as integer
dim NNN, LLL, LL as string

LL = "El valor que le quieras dar"

    For Vi = 1 To Len(LL)
        LLL = Mid$(LL, Vi, 1)
        If LLL = "1" Then NNN = NNN & LLL
        If LLL = "2" Then NNN = NNN & LLL
        If LLL = "3" Then NNN = NNN & LLL
        If LLL = "4" Then NNN = NNN & LLL
        If LLL = "5" Then NNN = NNN & LLL
        If LLL = "6" Then NNN = NNN & LLL
        If LLL = "7" Then NNN = NNN & LLL
        If LLL = "8" Then NNN = NNN & LLL
        If LLL = "9" Then NNN = NNN & LLL
        If LLL = "0" Then NNN = NNN & LLL
    Next

' NNN sera el resultado en numeros

Título: Re:Obtener solo los numeros de un string
Publicado por: Psyke1 en Enero 12, 2011, 04:45:07 pm
@wolf_kof
Probablemente esa sea la peor forma que hay... :-\

@lucius
Te hice estas funciones:

Forma clásica:
Código: (vb) [Seleccionar]
Option Explicit
 
Private Sub Form_Load()
    Debug.Print Only_Numbers("hola1 ¿que34 tal538?")
End Sub
 
Public Function Only_Numbers(ByRef sText As String) As String
Dim sActualChar                 As String * 1
Dim lTotalChar                  As Long
Dim x                           As Long
    lTotalChar = LenB(sText) \ 2
    If CBool(lTotalChar) Then
        For x = 1 To lTotalChar
            sActualChar = Mid$(sText, x, 1)
            If IsNumeric(sActualChar) Then Only_Numbers = Only_Numbers & sActualChar
        Next
    End If
End Function

Forma avanzada:
Código: (vb) [Seleccionar]
Option Explicit
Option Base 0

Private Declare Function ArrayPtr Lib "msvbvm60" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As Long, ByVal Value As Long)

Private Function GetNumbersByString(ByRef sText As String) As String
Dim intAsc()                                    As Integer
Dim lngAscHeader(5)                             As Long
Dim lngPos                                      As Long
Dim lngTextLen                                  As Long

    lngTextLen = LenB(sText) \ 2
    If lngTextLen > 1 Then

        lngAscHeader(0) = &H1
        lngAscHeader(1) = &H2
        lngAscHeader(3) = StrPtr(sText)
        lngAscHeader(4) = lngTextLen
        PutMem4 ArrayPtr(intAsc), VarPtr(lngAscHeader(0))
       
        Do Until lngPos = lngTextLen
            Do
                If intAsc(lngPos) < 48 Then Exit Do
                If intAsc(lngPos) > 57 Then Exit Do
                GetNumbersByString = GetNumbersByString + CStr(intAsc(lngPos) - 48)
                lngPos = lngPos + 1
            Loop Until lngPos = lngTextLen
           
            lngPos = lngPos + 1
        Loop
        PutMem4 ArrayPtr(intAsc), 0
    End If
End Function

Código: (vb6) [Seleccionar]
Private Sub Form_Load()
Const s                     As String = "que 345 vivan 09453 las456 r4n4s"

    Debug.Print GetNumbersByString(s)
   
End Sub

Resultado:
Código: [Seleccionar]
3450945345644


Tambien podria hacerlo con RegExp...
Creo que me merezco un +1... ::)
jajajajaja ;D
Nah, en serio, espero que te sirva ;)

DoEvents! :P
Título: Re:Obtener solo los numeros de un string
Publicado por: ssccaann43 en Enero 12, 2011, 04:57:45 pm
Wao rana, te lo has currao tio...! Excelente...! Necesitare de tus ranaconocimientos pronto, te aviso...!
Título: Re:Obtener solo los numeros de un string
Publicado por: YAcosta en Enero 12, 2011, 05:10:21 pm
Pero porque tanto codigo para lo que han pedido???
Código: (vb) [Seleccionar]
LL = "4234ABC45"

For i = 1 To Len(LL)
   If IsNumeric(Mid(LL, i, 1)) Then
      a = a & Mid(LL, i, 1)
   End If
Next i

MsgBox (aa)

rana igual te di un +1
Título: Re:Obtener solo los numeros de un string
Publicado por: Psyke1 en Enero 12, 2011, 05:20:47 pm
Ya YvanB, solo ponía varias opciones... ;)
Tu forma es igual que la mia (versión clásica).
Gracias por el +1 ;D

DoEvents! :P
Título: Re:Obtener solo los numeros de un string
Publicado por: raul338 en Enero 12, 2011, 05:43:31 pm
@wolf_kof
Probablemente esa sea la peor forma que hay... :-\

No seas tan malo, lo que hizo es exactamente igual que la tuya, es lo que habrias pensado en forma de algoritmo y lo traspaso :P
Título: Re:Obtener solo los numeros de un string
Publicado por: Psyke1 en Enero 12, 2011, 05:49:22 pm
@wolf_kof
Probablemente esa sea la peor forma que hay... :-\

No seas tan malo, lo que hizo es exactamente igual que la tuya, es lo que habrias pensado en forma de algoritmo y lo traspaso :P
Él sabe que no lo dije a mal, somos buenos amigos, solo era una apreciación... :P



Pero porque tanto codigo para lo que han pedido???
...

Tambien lo digo por esto:
Tu forma de hacerlo vs mis funciones (de tanto código ::))
Probado con cadenas cortas no hay mucha diferencia, pero con una cadena muy larga(100000 carácteres) si que la hay...

Código: [Seleccionar]
Mr.Frog -->4,785 msec
YvanB   -->32,431 msec

DoEvents! :P

Título: Re:Obtener solo los numeros de un string
Publicado por: YAcosta en Enero 12, 2011, 06:55:30 pm
Ya YvanB, solo ponía varias opciones... ;)
Tu forma es igual que la mia (versión clásica).
Gracias por el +1 ;D

DoEvents! :P

No papaa todo bien, por eso el +1, y si pudiera pondria mas. Si, mis formas son igual a las tuyas jejejej.

No el segundo codigo si es alucinantes, excelente, y correcto que para cadenas largas es mejor el segundo.
Título: Re:Obtener solo los numeros de un string
Publicado por: LeandroA en Enero 13, 2011, 03:09:12 am
Hola te paso dos variantes mas

Código: (Vb) [Seleccionar]
Option Explicit

Private Sub Form_Load()
    MsgBox ExtraerNumeros("452FH3.34-F0")
    MsgBox ExtraerNumeros2("452FH3.34-F0")
End Sub


Private Function ExtraerNumeros(ByVal sCadena As String) As String
    Dim i As Long
    Dim sChr As String
   
    For i = 1 To Len(sCadena)
        sChr = Mid$(sCadena, i, 1)
        Select Case sChr
            Case 0 To 9
                ExtraerNumeros = ExtraerNumeros & sChr
        End Select
    Next
End Function

Private Function ExtraerNumeros2(ByVal sCadena As String) As String
    Dim i As Long
    Dim sChr As String
   
    For i = 1 To Len(sCadena)
        sChr = Mid$(sCadena, i, 1)
       If IsNumeric(sChr) Then
            ExtraerNumeros2 = ExtraerNumeros2 & sChr
        End If
    Next
End Function
Título: Re:Obtener solo los numeros de un string
Publicado por: LeandroA en Enero 13, 2011, 03:11:40 am
huyyy cualquiera me mande, vi solo la respuesta de wolf_kof son iguales a las que ya pusieron.
Título: Re:Obtener solo los numeros de un string
Publicado por: ssccaann43 en Enero 13, 2011, 11:27:29 am
La Rana es un adicto sin retorno del VB...! Me gusta su vicio..! ;D
Título: Re:Obtener solo los numeros de un string
Publicado por: YAcosta en Enero 13, 2011, 02:15:05 pm
huyyy cualquiera me mande, vi solo la respuesta de wolf_kof son iguales a las que ya pusieron.

A mi me paso exactamente lo mismo con el ejemplo de MrFrog pero no lo comente pq pensé que nadie me creeria. Su codigo no lo lei me fui de largo y cuando dije "codigo largo" lo hacia por la primera respuesta, o sea de mi amigo wolf. Pero igual, toy con roche jejejeje

dulces besos
Título: Re:Obtener solo los numeros de un string
Publicado por: erbuson en Enero 14, 2011, 01:13:00 pm
Hola, ya puestos a poner posibilidades, esta es un 30% más rapida que el IsNumeric, pero ojo estamos hablando para hacer la prueba de un bucle de 200.000

Código: (vb) [Seleccionar]
Private Function LosNumeros(Cadena As String) As String
  Dim c As Integer
  For c = 1 To Len(Cadena)
    If InStr("1234567890", Mid$(Cadena, c, 1)) Then LosNumeros = LosNumeros & Mid$(Cadena, c, 1)
  Next
End Function

Saludos
Título: Re:Obtener solo los numeros de un string
Publicado por: wolf_kof en Enero 15, 2011, 01:02:40 pm
 
dulces besos

 :o

Gracias por los animos, mi funcion puede ser tosca y sin grandes algoritmos, pero yo no ando dando dulces besos (WTF, jaja) (broma), a su respuesta por mi codigo, a mi me funciona, y para mi eso basta.  :-X

PD:  ;D comprueven la velocidad (Mi Basura de Codigo) le gana a MrFrog
Título: Re:Obtener solo los numeros de un string
Publicado por: Psyke1 en Enero 16, 2011, 01:35:59 pm
PD:  ;D comprueven la velocidad (Mi Basura de Codigo) le gana a MrFrog

Me da que estás equivocado. ???
Seguramente, no has compilado el proyecto, en el IDE no nos mostrará lo mismo. ;)
También debes compilarlo quitando la comprobación de límites de arrays.



Cadena larga : 10000 dígitos
Cadena corta : 35 dígitos
Testeado compilado usando la clase CTiming.cls.

Resultado:
(http://img524.imageshack.us/img524/103/dibujoouh.jpg)

DoEvents! :P
Título: Re:Obtener solo los numeros de un string
Publicado por: VanHan en Enero 16, 2011, 02:14:30 pm
 ;D Bueno me interesó el post, y me puse a comprobar con mis computadoras las velocidades que imprimia el proyecto en el Form.

Muestro mis resultados:


(http://img12.imageshack.us/img12/1072/notebookp.jpg)

(http://img191.imageshack.us/img191/6787/pc3t.jpg)


Es notable quien ha ganado...

PD: Lea tenes q agregar al FORO un Resise Screen...

Salu2
[vHn]

Título: Re:Obtener solo los numeros de un string
Publicado por: LeandroA en Enero 16, 2011, 02:31:48 pm
@VanHan, Que es un Resise Screen para un foro, perdona la ignorancia, es algun tipo de complemento, para que sirve?

Saludos.
Título: Re:Obtener solo los numeros de un string
Publicado por: VanHan en Enero 16, 2011, 03:06:37 pm
Hola Lea, es un script/addons/plugin/complemento que sirve para achicar el tamaño de la imagen cuando supera los márgenes de los threads...

Algo asi...
Mira: http://custom.simplemachines.org/mods/index.php?mod=1769

PD: si no me lograas entender avisame por PM q te muestro otro foro q lo hace...

Salu2
[vHn]
Título: Re:Obtener solo los numeros de un string
Publicado por: xkiz ™ en Enero 16, 2011, 03:20:06 pm
@VanHan los hots de imagenes, casi siempre al subir una imagen te da varias opciones y una de ellas es un thumbnail(miniatura) con un link a la imagen original...
Título: Re:Obtener solo los numeros de un string
Publicado por: VanHan en Enero 16, 2011, 04:09:34 pm
@xkiz Esa no es la idea, la idea es poner una imgágen con buena calidad y que el foro se encargue mediante un script de hacerle un resise... De esta forma podemos apreciar la calidad de la imágen...

Lea aca tenes algo interesante:

Under Admin -> Gallery Configuration -> Settings
"Resize Images if too large"  make sure that is checked

O sino: http://zbcode.com/topic/1716756/1/

SAlu2
[vHn]
Título: Re:Obtener solo los numeros de un string
Publicado por: wolf_kof en Enero 17, 2011, 02:59:35 pm
ya sabia que Mrs.Frog era mas rapido, pero solo queria divagar un rato  8)  ::)
Título: Re:Obtener solo los numeros de un string
Publicado por: estebanjb en Enero 27, 2015, 12:44:08 pm

Gente este método no falla nunca y es lo más rápido que hay.

Código: [Seleccionar]
Public Class Form1

    Private Function obtenerNumeros(pTexto As String)
        Dim i As Integer = 0
        Dim retorno As String = Nothing
        While i < pTexto.Length
            If pTexto(i) >= "0" And
                pTexto(i) <= "9" Then
                retorno += pTexto(i)
            End If
            i += 1
        End While
        Return retorno
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox(obtenerNumeros(TextBox1.Text))
    End Sub

End Class

Título: Re:Obtener solo los numeros de un string
Publicado por: coco en Enero 29, 2015, 07:53:55 pm

Gente este método no falla nunca y es lo más rápido que hay.

Código: [Seleccionar]
Public Class Form1

    Private Function obtenerNumeros(pTexto As String)
        Dim i As Integer = 0
        Dim retorno As String = Nothing
        While i < pTexto.Length
            If pTexto(i) >= "0" And
                pTexto(i) <= "9" Then
                retorno += pTexto(i)
            End If
            i += 1
        End While
        Return retorno
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox(obtenerNumeros(TextBox1.Text))
    End Sub

End Class


Hola, 3 cosas:
1º Reviviste un thread de hace 4 años.
2º el codigo que vos propones es de .NET
3º es mas lento tu codigo, debido a que .NET toma como objetos a los strings, inclusive al "0" y "9". Esto implica que al hacer la comparacion de si es mayor o igual, o menor o igual, se llaman a las funciones sobrecargadas de ambos objetos para comprobar lo mismo. La funcion IsNumeric de VB6 simplemente chequea si el ascii de tal caracter está entre los limites, similar a lo que propones vos, pero comprobando numericamente el ascii (lo cual es mas rapido ya que son 3 lineas en assembly).