hayforma de que en un texto combinado con numeros, saque de ahi solo los numero....ayuden
Si, si hay forma.
Saludos
Cita de: rob1104 en 26 Junio 2010, 04:15 AM
Si, si hay forma.
:xD :xD :xD
Si! con expresiones regulares!!!!
(\d+)
Esa es la expresion regular para obtener todos los numeros de un texto
Ahora investiga como usar las expresiones regulares y como obtener los grupos generados por las ER (expresiones regulares) desde vb ;)
No manejo vb, aunque te dare otra idea mas no el codigo, primero calculas cuantos caracteres tiene la cadena, haces un ciclo con el dato anterior parar recorrer la cadena, comparas cada caracter, y aquellos que sean numeros los guardas en una variable. Seguro el vb debe tener alguna funcion para hacerte la vida aun mas facil, asi que BUSCA. :)
Es mejor y más fácil con expresiones regulares :P. Pero no tengo VB en mi laptop :S
Function dejarNumeros(cadenaTexto As String) As String
Const listaNumeros = "0123456789"
Dim cadenaTemporal As String
Dim i As Integer
cadenaTexto = Trim$(cadenaTexto)
If Len(cadenaTexto) = 0 Then
Exit Function
End If
cadenaTemporal = ""
For i = 1 To Len(cadenaTexto)
If InStr(listaNumeros, Mid$(cadenaTexto, i, 1)) Then
cadenaTemporal = cadenaTemporal + Mid$(cadenaTexto, i, 1)
End If
Next
return cadenaTemporal
End Function
Fuente: :http://ftp.ajpdsoft.com/modules.php?name=Content&pa=showpage&pid=228
Me aburria :-[
Private Sub Form_Load()
Debug.Print SoloNumeros("P1rueba922")
End Sub
Public Function SoloNumeros(ByVal sCadena As String) As String
Dim vItem As Variant
Dim bvBytes() As Byte
bvBytes = StrConv(sCadena, vbFromUnicode)
For Each vItem In bvBytes
If (48 <= vItem) And (vItem <= 57) Then
SoloNumeros = SoloNumeros & Chr$(vItem)
End If
Next vItem
End Function
Aqui dejo mi alternativa:
Option Explicit
Private Sub Form_Load()
Debug.Print Only_Numbers("hola1 ¿que34 tal538?")
End Sub
Public Function Only_Numbers(ByVal sText As String) As String
Dim sActualChar As String * 1
Dim lTotalChar As Long
Dim x As Long
lTotalChar = Len(sText)
If lTotalChar > 0 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
Salu2! ;)
Ando desvelándome y esto ya lo había hecho pero... no me dio la gana resolverle la vida en el momento asi qué con un lindo retardo pongo esto:
Es mas lento qué los anteriores aquí expuestos pero esta pensado para:
* Obtener números Negativos (Con signo).
* Obtener números con Decimales!¡ (Optativo Coma decimal o punto Decimal según se especifique!¡.).
* No esta Optimizado el codigo!¡.
* No esta terminado aun!¡.
* Bug de que si se espesifica un signo valido (Ejemplo coma decimal) tomara en sucesion esta sentencia "6546.65163.565" o equivalente a la misma!¡.
'
' ////////////////////////////////////////////////////////////////
' // Autor: BlackZeroX ( Ortega Avila Miguel Angel ) //
' // //
' // Web: http://InfrAngeluX.Sytes.Net/ //
' // //
' // |-> Pueden Distribuir Este Código siempre y cuando //
' // no se eliminen los créditos originales de este código //
' // No importando que sea modificado/editado o engrandecido //
' // o achicado, si es en base a este código //
' ////////////////////////////////////////////////////////////////
'
Option Explicit
Public Function GetArrayNumbersFromString(ByVal StrInput$, Optional ByVal SepDecimal$ = ".") As String()
Dim StrArray_TMPArrayNumers$()
Dim Lng_Pos&
Dim Lng_LenMid&
Dim Lng_PosIInArray&
Dim Lng_LenStr&
Dim Str_Tmp$
Dim Str_Char$
Lng_LenStr& = Strings.Len(StrInput$)
If Lng_LenStr& > 1 Then
If Not Information.IsNumeric(StrInput$) Then
Str_Char$ = Strings.Space$(1)
For Lng_Pos& = 1 To Lng_LenStr&
Str_Char$ = Strings.Mid$(StrInput$, Lng_Pos&, 1)
If IsNumeric(Str_Char$) Or (Lng_LenMid& And Str_Char$ = SepDecimal$) Or (Lng_LenMid& = 0 And Str_Char$ = "-") Then
Lng_LenMid& = Lng_LenMid& + 1
ElseIf Lng_LenMid& > 0 And Lng_Pos& <= Lng_LenStr& - 1 Then
If Lng_LenMid& = 1 And Strings.Mid$(StrInput$, Lng_Pos& - Lng_LenMid&, Lng_LenMid&) = "-" Then
Lng_LenMid& = 0
Else
ReDim Preserve StrArray_TMPArrayNumers$(Lng_PosIInArray&)
StrArray_TMPArrayNumers$(Lng_PosIInArray&) = Strings.Mid$(StrInput$, Lng_Pos& - Lng_LenMid&, Lng_LenMid&)
Lng_PosIInArray& = Lng_PosIInArray& + 1
Lng_LenMid& = 0
End If
End If
Next
If Lng_LenMid& > 0 Then
ReDim Preserve StrArray_TMPArrayNumers$(Lng_PosIInArray&)
StrArray_TMPArrayNumers$(Lng_PosIInArray&) = Strings.Mid$(StrInput$, Lng_Pos& - Lng_LenMid&, Lng_LenStr&)
End If
Else
ReDim StrArray_TMPArrayNumers$(Lng_PosIInArray&)
StrArray_TMPArrayNumers$(Lng_PosIInArray&) = StrInput$
End If
End If
GetArrayNumbersFromString = StrArray_TMPArrayNumers$()
End Function
Const Str_Cadena$ = "123.4567.89.miguel angel000ort.....ega avila-a159.753jjj"
MsgBox Strings.Join(GetArrayNumbersFromString(Str_Cadena$, ""), "-") & Constants.vbNewLine & _
Strings.Join(GetArrayNumbersFromString(Str_Cadena$, "."), "-")
Sangriento Infierno Lunar!¡.
Buena Black! :)
Pero tengo una duda:
Citar
* Bug de que si se espesifica un signo valido (Ejemplo coma decimal) tomara en sucesion esta sentencia "6546.65163.565" o equivalente a la misma!¡.
No entiendo, si detecta
"6546.65163.565" que quieres hacer exactamente??? :huh:
Entonces si en la cadena hay una direeccion Ip, estaria bien cojerla, ¿no? :silbar:
PD: En 2 dias subo una alternativa al code de
BlackZer0X! :P
Salu2! ;)
un numero valido no puede ni deve tener dos puntos decimales validos!¡.
Sangriento Infierno Lunar!¡.
Si si, eso quedo claro, pero...
Entonces que quieres hacer si tienes la cadena: "6546.65163.565"? :huh:
No lo guardarias en el array??
Salu2! :P
He hecho esta bonita funcion mientras me aburria :P
Public Function ExtractNumbers(ByVal sString As String, Optional bReturnAsString As Boolean = False) As Collection
Dim cTemp As New Collection
Dim sTemp As String
Dim sChar As String * 1
Dim i As Long
sString = Replace$(sString, ",", ".")
For i = 1 To Len(sString)
sChar = Mid$(sString, i, 1)
Do While (sChar Like "#") Or (sChar = ".")
sTemp = sTemp & sChar
i = i + 1
sChar = Mid$(sString, i, 1)
Loop
If Val(sTemp) Then
cTemp.Add IIf((bReturnAsString = False), Val(sTemp), sTemp)
End If
sTemp = vbNullString
Next i
Set ExtractNumbers = cTemp
End Function
Ejemplo:
Private Sub Form_Load()
Dim vItem As Variant
For Each vItem In ExtractNumbers("Estoy provando la extracción de números como 1992, también la extracción de números decimales: 3,1415 o 3.1415")
Debug.Print vItem
Next vItem
End Sub
Public Function GetNumeros(text As String) As Collection
' Incluir en las referencias: Microsoft VBScritp Regular Expressions 5.5
' Obtener numeros, mediante expresiones regulares. By Raul338
On Error GoTo err
Dim cTemp As New Collection
Dim objRegExp As RegExp
Dim objMatch As Match
Dim objMatches
Set objRegExp = New RegExp
Dim patron As String
'patron = "(\d+)" ' Numeros enteros
'patron = "(\d+(?:[\.,]\d+)?)" ' Numeros con/sin decimales
patron = "(\d{1,3}(\.\d{3})+(?:,\d+)?|\d+(?:,\d+)?)" ' Numeros con separador de miles (.) con/sin decimales (,)
'patron = "(\d{1,3}(\,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?)" ' Numeros con separador de miles (,) con/sin decimales (.)
'patron = "(\d+[,.]\d+)" ' Numeros con decimales
objRegExp.Pattern = patron
objRegExp.Global = True
Set objMatches = objRegExp.Execute(text)
For Each objMatch In objMatches
cTemp.Add objMatch.Value
Next
Set GetNumeros = cTemp
Exit Function
err:
' Aca tira error en caso de que metan mal la mano en las expresiones regulares xD
End Function
Private Sub Form_Load()
Dim item As Variant
Dim s As String
s = "Estoy provando la extracción de números como 1992, también la extracción de números decimales: 3,1415"
s = s & "Tambien puedo decir que tengo 1000000,24 dolares o 1.123.456,78 euros (?)"
For Each item In GetNumeros(s)
Debug.Print item
Next
End Sub
Aver quien supera eso (?) :xD
... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.
bueno para evitar la referencia usar
Dim cTemp As New Collection
Dim objRegExp As Object 'RegExp
Dim objMatch As Object 'Match
Dim objMatches As Object
Dim patron As String
Set objRegExp = CreateObject("VBScript.RegExp") 'New RegExp
Dulce Infierno Lunar!¡.
@Karcrack
CitarMe aburria :-[
CitarHe hecho esta bonita funcion mientras me aburria :P
AJAJAJA :xD
Te aburres mucho tu, ¿¿eh?? :P
Cita de: BlackZeroX▓▓▒▒░░ en 29 Junio 2010, 16:55 PM
... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.
JAJAJJAJA :laugh:
Raul y sus
Expr.Reg... :silbar:
Bueno aqui os dejo la funcion que prometi, que ademas capta los numeros negativos :P:
Option Explicit
Public Function Get_Only_Numbers(ByVal sText As String) As String()
Const sDecimals As String = ",.'"
Dim sNumbersArray() As String
Dim sActualChar As String * 1
Dim sNextChar As String * 1
Dim sPreviousChar As String * 1
Dim bAcceptString As Boolean
Dim lTotalChar As Long
Dim x As Long
Dim y As Long
lTotalChar = Len(sText)
If lTotalChar > 0 Then
ReDim sNumbersArray(0)
For x = 1 To lTotalChar
If x > 1 Then sPreviousChar = Mid$(sText, x - 1, 1)
sActualChar = Mid$(sText, x, 1): sNextChar = Mid$(sText, x + 1, 1)
If ((sActualChar = Chr$(45) Or InStr(sDecimals, sActualChar) > 0 And IsNumeric(sPreviousChar)) _
And IsNumeric(sNextChar)) Or (IsNumeric(sActualChar)) Then
bAcceptString = True
Else
If bAcceptString = True Then y = y + 1: ReDim Preserve sNumbersArray(y): bAcceptString = False
End If
If bAcceptString = True Then sNumbersArray(y) = sNumbersArray(y) & sActualChar
Next x
Get_Only_Numbers = sNumbersArray()
Erase sNumbersArray
End If
End Function
Private Sub Form_Load()
Dim vItem As Variant
Dim sStringToAnalyze As String
sStringToAnalyze = "Estoy provando la extracción de números como 1992, también la extracción de números decimales: 3,1415 o 3.1415"
sStringToAnalyze = sStringToAnalyze & "También puedo decir que tengo 1000000,24 dólares o 1.123.456,78 euros (?)"
sStringToAnalyze = sStringToAnalyze & "Pero mi función también reconoce numeros como el -2344 y 5'567 y no los confunde con m.456 ni con -a89 ... =)"
For Each vItem In Get_Only_Numbers(sStringToAnalyze): Debug.Print vItem: Next
End Sub
Obtengo esto:
Citar
3,1415
3.1415
1000000,24
1.123.456,78
-2344
5'567
456
89
Salu2! ;)
Cita de: BlackZeroX▓▓▒▒░░ en 29 Junio 2010, 16:55 PM
... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.
Yo dije primero que se puede con expreg. Ustedes fueron los tipos con tiempo libre para dedicarle al tema, yo la hice facil y corta xD
Cita de: Karcrack en 29 Junio 2010, 12:26 PM
He hecho esta bonita funcion mientras me aburria :P
No funciona con los ultimos 2 numeros q puse :P
Cita de: raul338 en 30 Junio 2010, 00:36 AM
Cita de: BlackZeroX▓▓▒▒░░ en 29 Junio 2010, 16:55 PM
... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.
Yo dije primero que se puede con expreg. Ustedes fueron los tipos con tiempo libre para dedicarle al tema, yo la hice facil y corta xD
Cita de: Karcrack en 29 Junio 2010, 12:26 PM
He hecho esta bonita funcion mientras me aburria :P
No funciona con los ultimos 2 numeros q puse :P
JOJOJOJO :laugh:
No, si al final acabamos a tortas!! :laugh:
Salu2! ;)
Buen codigo Psyke, pero seria mas sencillo si trabajaras con Collections ;)
Gracias Karcrack! ;D
Lo tendre en cuenta para futuras ocasiones! ;)
Salu2!
Buff, espero que no me llameis pesado :laugh:, pero esta es mi RegExp para hacer
EXACTAMENTE lo que hace la funcion que postee:
Citar((\-)?\d+(([\.,']\d+)+)?)
Claro que no incluye validacion como la que hizo Raul... :-\
Predon por revivir post... :-* ;)
DoEvents¡! :P