
Originariamente inviata da
oregon
Non ho testato le prestazioni ma per semplicità potrebbe essere utile scrivere
codice:
For i = s.Length - 1 To 1 Step -1
s = s.Insert(i, ",")
Next i
Questa soluzione ha l'innegabile pregio della semplicità (cosa che in questo caso può convenire privilegiare), ma sapendo cosa accade "sotto il cofano", è abbastanza chiaro che è O(n^2) quando potrebbe essere O(n) (forse anche qualcosa di peggio, dato che le stringhe .NET sono immutabili e ogni modifica equivale ad allocare una nuova stringa).
In genere per manipolazioni di questo genere l'approccio più rapido è basato su StringBuilder (che corrisponde di fatto ad un buffer di caratteri "stile C"):
codice:
Private Function AddCommas(str As String) As String
If str.Length=0 Then Return str
Dim sb As New StringBuilder
sb.Length=str.Length*2
For i As Integer = 0 To str.Length - 1
sb(i*2)=str(i)
sb(i*2+1)=","c
Next
sb.Length-=1
Return sb.ToString()
End Function
Credo anch'io che la soluzione in stile programmazione funzionale di sspintux sia la più elegante, ed è sostanzialmente è equivalente a quello che in Python scriverei come
codice:
def AddCommas(s):
return ",".join(s)
(in effetti, visto che sparisce il 90% della verbosità non starei nemmeno a metterlo in una funzione a parte).
Da notare che nessuno degli approcci qui citati tiene in considerazione i surrogate pairs; qualunque stringa UTF-16 contenente codepoints superiori a 0xD7FF passata a queste funzioni verrebbe sfasciata senza pietà.
Per sistemare questo problema, un approccio potrebbe essere:
codice:
Private Function AddCommas(str As String) As String
If str.Length = 0 Then Return str
Dim sb As New StringBuilder(str.Length*2)
For i As Integer = 0 To str.Length - 1
sb.Append(str(i))
If Not char.IsHighSurrogate(str(i)) Then
sb.Append(","c)
End If
Next
sb.Length-=1
Return sb.ToString()
End Function