Italian Metodo per creare una stringa composta da n caratteri uguali

Sabotto

Well-Known Member
Licensed User
Vuoto di memoria e relativa domanda da niubbo.
Posso creare una stringa composta da n caratteri uguali cme facevo con VB usando String$(n,carattere")?

B4X:
dim MyString as string
MyString = "--------------------"
'oppure'
MyString = string$(20,"-") 'in VB, ma in B4A?
 

LucaMs

Expert
Licensed User
Longtime User
Non credo ci sia un modo "integrato" altrettanto semplce; ci sono probabilmente molti esempi, librerie, snippet... credo qualcosa anche pubblicato da me, millenni fa.

Potresti fare in due modi:

  1. il più breve (codice) dipende se sia possibile, se conosci già il carattere (puoi scriverlo direttamente nel codice) ed il numero massimo di caratteri
  2. usare StringBuilder
1
B4X:
Dim MyString as string
MyString = "------------------------------" ' Sono 30, max

Dim NewString As Strint
NewString = MySing.SubString2(0, 10) ' Se ne vuoi 10


2
B4X:
Public Sub RepeatChar(Ch As String, HowMany As Int) As String
    Dim SB As StringBuilder
    SB.Initialize

    For i = 0 To HowMany - 1
        SB.Append(Ch)   
    Next
    
    Return SB.ToString
End Sub
 

Filippo

Expert
Licensed User
Longtime User
Non credo ci sia un modo "integrato" altrettanto semplce; ci sono probabilmente molti esempi, librerie, snippet... credo qualcosa anche pubblicato da me, millenni fa.
no mille, solo 3 anni fa ?
 

LucaMs

Expert
Licensed User
Longtime User
A parte il fatto che, per la mia memoria, 3 anni reali equivalgono circa a 5.000 anni "percepiti" (come la boiata sulle temperature) ?
mi pare che in quella libreria non ci sia una funzione per la domanda in questione. Mi pare, eh!
 

Sabotto

Well-Known Member
Licensed User
Si so a priori che mi serve una stringa di "quel" carattere ... questo: "-"
Solo nel codice so quanti, però

Userò il metodo 1
 
Last edited:

Filippo

Expert
Licensed User
Longtime User
A parte il fatto che, per la mia memoria, 3 anni reali equivalgono circa a 5.000 anni "percepiti" (come la boiata sulle temperature) ?
mi pare che in quella libreria non ci sia una funzione per la domanda in questione. Mi pare, eh!
Poiché non ho mai usato questa libreria, ho pesato che fosse inclusa.
Tuttavia, se non c'è, sarebbe ora di includere questa funzione.
 

amorosik

Expert
Licensed User
A parte il fatto che, per la mia memoria, 3 anni reali equivalgono circa a 5.000 anni "percepiti" (come la boiata sulle temperature) ?
mi pare che in quella libreria non ci sia una funzione per la domanda in questione. Mi pare, eh!

Eh gia', raggione hai
Come mai non c'e' ancora?
 

Filippo

Expert
Licensed User
Longtime User
Userò il metodo 1
Io ti consiglio il terzo:

B4X:
Dim MyString As String = vbString(20,"-")

Sub vbString(quantity As Int, str As String) As String
    Dim s As String = ""
    For i = 0 To quantity - 1
        s = s & str
    Next
    Return s
End Sub
 

Aldo's

Active Member
Licensed User
Oltretutto è più elastico e riutilizzabile per tutto...soprattutto rispetto alla soluzione 1.
 

Alessandro71

Well-Known Member
Licensed User
Longtime User
parliamo di lana caprina, ma l'utilizzo di String invece di StringBuilder è meno efficiente, perchè ogni stringa è immutabile, quindi ad ogni s = s & ... viene creata una nuova stringa e distrutta quella precedente
 

LucaMs

Expert
Licensed User
Longtime User
parliamo di lana caprina, ma l'utilizzo di String invece di StringBuilder è meno efficiente, perchè ogni stringa è immutabile, quindi ad ogni s = s & ... viene creata una nuova stringa e distrutta quella precedente
Ed il codice è talmente simile...!
Cmq il motivo per cui non ho usato una var stringa ma stringbuilder è proprio quello indicato da Alessandro (certo che se non devi costruire stringhe con milioni di caratteri, i tempi saranno praticamente identici).
 

emexes

Expert
Licensed User
Recursive:
Sub MultiplyString(S As String, N As Int) As String
    If N > 1 Then
        Dim Temp As String = MultiplyString(S, Bit.ShiftRight(N, 1))    'ShiftRight 1 is same as integer divide by 2
        If Bit.And(N, 1) <> 0 Then    'And 1 is same as Mod 2
            Return Temp & Temp & S
        Else
            Return Temp & Temp
        End If
    Else If N = 1 Then
        Return S
    End If
  
    Return ""    'works without, but nice to have
End Sub
Test:
Log(MultiplyString("B4X! ", 17))
Log output:
Waiting for debugger to connect...
Program started.
B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X! B4X!
Program terminated (StartMessageLoop was not called).
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…