https://foro.gambas-es.org/viewtopic.php?f=4&t=8029
-----------------------------------
tincho
Tuesday, 05 May 2020, 21:39

Extendiendo La Clase String
-----------------------------------
Hola a todos.
En base a otro hilo en donde comentamos sobre algunos métodos que le "faltaban" a la clase [b]String[/b] pongo aquí como la extendí.
[code linenumbers=false syntax=gambas]
' Gambas class file
'' This class extends the standard String class in gambas
Export
Create Static
Inherits String
'' This function counts how much times some string apear in other
Public Function StrCount(sWhere As String, sWhich As String) As Integer
  Dim i As Integer
  Dim Cursor As Integer
  Dim Counter As Integer
  i = 1
  Repeat
    Cursor = InStr(sWhere, sWhich, i)
    If Cursor > 0 Then
      Inc Counter
      i = i + Cursor + String.Len(sWhich)
    Endif
  Until InStr(sWhere, sWhich, i) = 0 Or i > String.Len(sWhich)
  Return Counter
End
[/code]
Espero les sea de utilidad.
Saludos.


-----------------------------------
cogier
Wednesday, 06 May 2020, 15:11

Re: Extendiendo La Clase String
-----------------------------------
Parece que hay algunos errores en su código. Intenta con el siguiente código: -

[code linenumbers=false syntax=gambas]
Public Sub Form_Open()

  Dim sString As String = "Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World"

  Print StrCount(sString, "World")

End

Public Function StrCount(sWhere As String, sWhich As String) As Integer

  Dim i As Integer = 1
  Dim Cursor As Integer
  Dim Counter As Integer

  'i = 1
  Repeat
    Cursor = InStr(sWhere, sWhich, i)
    If Cursor > 0 Then
      Inc Counter
      'i = i + Cursor + String.Len(sWhich)
      i = Cursor + String.Len(sWhich)
    Endif
  Until InStr(sWhere, sWhich, i) = 0 Or i > String.Len(sWhere)
  'Until InStr(sWhere, sWhich, i) = 0 Or i > String.Len(sWhich)
  Return Counter

End
[/code]


-----------------------------------
Guizans
Wednesday, 06 May 2020, 21:23

Re: Extendiendo La Clase String
-----------------------------------
Hola.

Mira que casualidad que necesité una función igual a esa hace poco, y también cree una clase extendida de String. [code linenumbers=false syntax=gambas]
Public Function Count(palabra As String, caracter As String, Optional inicio As Integer = 1, Optional final As Integer = 0) As Integer ''Devuelve el número de coincidencias de una subcadena en el rango [inicio, fin].
                                                                                                                                       
  Dim longitud As Integer
  Dim cortado As New String[]
  Dim posicion As Integer[]
  Dim palabraS As String
  
  longitud = String.Len(palabra)
  If final = 0 Then final = longitud
  
  palabraS = String.Mid$(palabra, inicio, final)
  
  posicion = FindNumber(palabraS, caracter)
  
  For Each a As Integer In posicion
    cortado.Add(String.Mid$(palabraS, a, String.Len(caracter)))
  Next
  
  Return cortado.Length
  
End

Public Function FindNumber(palabra As String, sufijo As String) As Integer[]  ''Encuentra en que posiciones de un string esta el sufijo devolviendo un array que contendrá las posiciones
  
  Dim a As Integer
  Dim pos As Integer = 0
  Dim posicion As New Integer[]
  
  While True
    a = InStr(palabra, sufijo, pos)
    If a = 0 Then
      Break
    Else
      posicion.Add(a)
      pos = a + 1
    Endif
  Wend
  
  Return posicion
  
End
[/code]

En este caso si que devuelve bien el número de coincidencias del ejemplo de cogier.

Un saludo.


-----------------------------------
tincho
Wednesday, 06 May 2020, 21:26

Re: Extendiendo La Clase String
-----------------------------------
[quote user="cogier" post="48356"]Parece que hay algunos errores en su código. Intenta con el siguiente código...[/code][/quote]
Gracias Cogier.
Saludos.


