Newsgroup: it.comp.lang.visual-basic
Titolo: Funzione per convertire da decimale a qualunque base

Ciao a tutti.
Qualcuno di voi avrebbe una bella funzioncina in VB già pronta per
convertire un numero espresso in notazione decimale in una stringa in un
qualunque altro formato ?
Grazie in anticipo.
Roby

 qualunque altro formato ?
No, ma credo che, se non ti interessano troppo le prestazioni, si possa fare
velocemente, almeno per i numeri interi... Provo... :)
Non é bella e non é ottimizzata (e non l'ho nemmeno provata)... quindi
nessuno mi linci... :)
Public Function ConvertiBase(ByVal Numero as long, Base as Variant) as
string 'a Numero passi il numero da convertire, a base il variant array
contenente i simboli della base: (es: array("1","2","3"...,"A","B"...)
    Dim LenBase as long 'Esempio: Base 3, base 15, base 100
    LenBase=ubound(base)
    Dim NumCifre as long 'Numero di cifre di cui é composto il risultato
    Dim N as long 'Variabile di servizio
    Do
        NumCifre=NumCifre+1
        N=N^lenBase
    loop until N>Numero
    ConvertiBase=space$(NumCifre)
    NumCifre=NumCifre-1
    Dim Cifra as long
    For N=NumCifre to 0 step -1
        Cifra = int(numero / lenbase)
        mid$(ConvertiBase,N+1,1)=base(cifra)
        Numero=Numero-cifra*lenbase^N
    next N
End Function
Provala... Se va bene ok... Altrimenti se nbon sai dove mettere le mani
ripostami in risposta... :)
        Ciao
                Allanon

Rispondermi da solo per me é ormai un'abitudine...
...se avessi prova l'algoritmo prima di postarlo! :(
Ecco la versione corretta:
Public Function ConvertiBase(ByVal Numero As Long, Base As Variant) As
String 'a Numero passi il numero da convertire, a base il variant array
contenente i simboli della base: (es: array("1","2","3"...,"A","B"...)
    Dim LenBase As Long 'Esempio: Base 3, base 15, base 100
    LenBase = UBound(Base) + 1
    Dim NumCifre As Long 'Numero di cifre di cui é composto il risultato
    Dim N As Long 'Variabile di servizio
    Do
        NumCifre = NumCifre + 1
        N = LenBase ^ NumCifre
    Loop Until N > Numero
    ConvertiBase = Space$(NumCifre)
    NumCifre = NumCifre - 1
    Dim Cifra As Long
    For N = NumCifre To 0 Step -1
        Cifra = Int(Numero / LenBase ^ N)
        Mid$(ConvertiBase, N + 1, 1) = Base(Cifra)
        Numero = Numero - Cifra * LenBase ^ N
    Next N
End Function
        Ciao
                Allanon

Come da Subject... Allanon... Mi licenzierň ed andrň a pelare patate...
l'algoritmo di prima va... ma il risultato é al contrario!
Cosě Funziona perň (provato :))
Public Function ConvertiBase(ByVal Numero As Long, Base As Variant) As
String 'a Numero passi il numero da convertire, a base il variant array
contenente i simboli della base: (es: array("1","2","3"...,"A","B"...)
    Dim LenBase As Long 'Esempio: Base 3, base 15, base 100
    LenBase = UBound(Base) + 1
    Dim NumCifre As Long 'Numero di cifre di cui é composto il risultato
    Dim N As Long 'Variabile di servizio
    Do
        NumCifre = NumCifre + 1
        N = LenBase ^ NumCifre
    Loop Until N > Numero
    ConvertiBase = Space$(NumCifre)
    NumCifre = NumCifre - 1
    Dim Cifra As Long
    For N = NumCifre To 0 Step -1
        Cifra = Int(Numero / LenBase ^ N)
        Mid$(ConvertiBase, NumCifre + 1 - N, 1) = Base(Cifra)


Non mi aspettavo tanto !
Avevo chiesto se qualcuno aveva una routine già pronta ed invece è stato
sviluppata ad hoc.
Grazie 1000 !
A buon rendere.
Roby

> Grazie 1000 !
Figurati! :)
Ho letto il tuo messaggio ed ho iniziato a pensare come fare... a quel punto
era una sfida da risolvere con me stesso... :)
L'unica cosa che ho trascurato di dirti é che VB mette a disposizione 2
belle funzioncine per trasformare in Esadecimale e Octagesimale (spero che
si scriva cosě) e sono Hex$ e Oct$... Con queste sei sicuramente molto piů
prestazionale (perň sono limitate alla base...)
            Ciao
                Allanon


Sě lo sapevo, perň avevo bisogno di convertire dei numeri su basi diverse
(25) per generare delle stringhe da utilizzare per dei codici di licenza.
Ti ringrazio di nuovo, mi hai fatto risparmiare un bel po' di lavoro.
Di nuovo a buon rendere.
Ciao.
Roby

 writes:
A> belle funzioncine per trasformare in Esadecimale e Octagesimale (spero che
                                                      ^^^^^^^^^^^^
Ottale. Era molto di moda ai tempi del PDP-11
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )

Ecco la versione corretta:
Ottimo! Si deve solo "girare" la stringa :)
-- 
Giovanni "Gyo" Perdicaro
E-Mail: 
gperd...@sicilyonline.it

era una sfida da risolvere con me stesso... :)
eh eh, credo che sia così un po' per tutti qui dentro ;)
E poi codice così può sempre tornare utile...
A pro Allanon, partendo dal tuo codice ne ho tirato fuori uno che
accetta come parametro Base un valore String (mi stanno antipatici gli
array...) tipo "0123456789ABCDEF"
Se serve...


 qualunque altro formato ?
Ed Allanon glie ne ha postata una fatta all'uopo.
Io ho sempre usato il metodo delle divisioni successive, a mano, ed in VB
più o meno suona così (con gli stessi parametri proposti da Allanon):
-------------------
Public Function ConvertiBase(ByVal Numero As Long, Base As Variant) As
String
Dim b As Long      'base
Dim n As Long      'quoziente parziale
Dim a As String    'stringa in costruzione
Dim r As Long      'resto parziale
    n = Numero
    b = UBound(Base) + 1
    a = ""
    Do
        r = n Mod b       'resto modulo la base
        n = n \ b         'divisione intera
        a = Base(r) & a   'le cifre più significative a destra!
    Loop Until n = 0
    ConvertiBase = a
End Function
-----------------
Secondo me comunque conviene passare la base come numero e lasciare che i
caratteri utilizzati siano quelli standard "0","1",..,"9","A",.., magari
passando l'array di caratteri (è più pratica una stringa) come parametro
Optional per i casi più strani (basi maggiori di 38, minuscole al posto
delle maiuscole, ecc.), costruendo al volo l'array di default:
------------------
Public Function ConvertiBase(ByVal Numero As Long, Base As Long, Optional
Cifre _
As String) As String
Dim n As Long      'quoziente parziale
Dim a As String    'stringa in costruzione
Dim r As Long      'resto parziale
Dim i As Integer
Dim c() As String  'array di cifre
    n = Numero
    ReDim c(Base)
    If IsMissing(Cifre) Then
        For i = 0 To Base - 1
            If i > 9 Then
                c(i) = Chr$(Asc("A") + i - 10)
            Else
                c(i) = Chr$(Asc("0") + i)
            End If
        Next i
    Else
        For i = 0 To Base - 1
            c(i) = Mid$(Cifre, i + 1, 1)
        Next i
    End If
    Do
        r = n Mod Base    'resto modulo la base
        n = n \ Base      'divisione intera
        a = c(r) & a      'le cifre più significative a destra!
    Loop Until n = 0
    ConvertiBase = a
End Function
---------------------------
Ciao, Silv:o)

 array...) tipo "0123456789ABCDEF"
Mhhmhhhh... é tutto vero... Non ci avevo proprio pensato... :-)
Io adoro gli array... MA ODIO i Variant... quindi ben venga la stringa!!!
            Ciao
                    Allanon

Io adoro gli array... MA ODIO i Variant... quindi ben venga la stringa!!!
Allora eccovela ^__^
'Numero: valore da convertire
'Base:   stringa contenente la progr.simbolica della numerazione
'        (es: binario => "01" esadecimale: "0123456789ABCDEF)
Public Function ConvertiBase(ByVal Numero As Long, Base As String) _
		As String
    Dim lBase As Long
    Dim lNumCifre As Long
    Dim n As Long
    Dim lCifra As Long
    Dim sTemp As String
    '   Numero di caratteri necessari...
    lNumCifre = 0
    lBase = Len(Base)
    Do
        lNumCifre = lNumCifre + 1
        n = lBase ^ lNumCifre
    Loop Until n > Numero
    '   Genera la stringa
    lNumCifre = lNumCifre - 1
    For n = lNumCifre To 0 Step -1
        lCifra = Int(Numero / lBase ^ n)
        sTemp = sTemp & Mid$(Base, lCifra + 1, 1)
        Numero = Numero - lCifra * lBase ^ n
    Next n
    ConvertiBase = sTemp
End Function
