Incrementale un alfanumerico

venerdì 14 novembre 2008 - 15.00

frenk17 Profilo | Junior Member

ciao ragazzi, ho un problema e, sebbene ho il presentimento che la soluzione è semplicissima, proprio non riesco a venirne a capo..
se ho un numero di serie alfanumerico es(AA34C281).
come faccio ad incrementare questo alfanumerico ad ogni ciclo di un ciclo for?
tengo a sottolineare che del numero di serie si devono incrementare non solo le i bnumeri ma anche le lettere..
per esempio arrivato a questa situazione:
AA34C999
il valore successivo deve essere
AA34D000


spero di essere stato chiaro...
grazie mille in anticipo...

0v3rCl0ck Profilo | Guru

>ciao ragazzi,

Ciao

>ho un problema e, sebbene ho il presentimento che
>la soluzione è semplicissima, proprio non riesco a venirne a
>capo..
>se ho un numero di serie alfanumerico es(AA34C281).
>come faccio ad incrementare questo alfanumerico ad ogni ciclo
>di un ciclo for?
>tengo a sottolineare che del numero di serie si devono incrementare
>non solo le i bnumeri ma anche le lettere..
>per esempio arrivato a questa situazione:
>AA34C999
>il valore successivo deve essere
>AA34D000
>

Le cifre vanno da 0 a 9 e le lettere da A a F ?

>
>spero di essere stato chiaro...
>grazie mille in anticipo...

Enjoy It

- Michael -
http://blogs.dotnethell.it/Regulator/

frenk17 Profilo | Junior Member

ma io a dire il vero pensavo di far andare le lettere dalla A alla Z... poi se è un problema mi adatto

0v3rCl0ck Profilo | Guru

Perchè se era dalla A alla F si poteva parlare di convertire il numero in esadecimale e viceversa...si può fare anche da A a Z. Adesso ci penso...
- Michael -
http://blogs.dotnethell.it/Regulator/

frenk17 Profilo | Junior Member

ok...grazie mille...

aiedail92 Profilo | Expert

Ciao

Puoi usare una funzione tipo questa:

private string Incrementa(string value) { //Crea un array contenente i caratteri del risultato char[] result = value.ToCharArray(); //Partendo dall'ultimo carattere, incrementa i precedenti //se il carattere passa da Z->A o 9->0 for (int i = result.Length - 1; i > 0; i--) { switch (result[i]) { //Se il carattere è Z o 9, imposta il carattere ad A o 0, //quindi aumenta anche il carattere precedente case 'Z': result[i] = 'A'; break; case 'z': result[i] = 'a'; break; case '9': result[i] = '0'; break; //Altrimenti incrementa il carattere e ritorna il risultato default: result[i]++; return new string(result); } } return new string(result); }

Luca

frenk17 Profilo | Junior Member

scusate se nn ve l ho detto prima ma a me il codice serve in vb.net

scusate

aiedail92 Profilo | Expert

Convertita in VB sarebbe:

Function Incrementa(ByVal value As String) As String Dim result As Char() = value.ToCharArray() For i As Integer = result.Length - 1 To 0 Step -1 Select Case result(i) Case "Z" result(i) = "A" Case "z" result(i) = "a" Case "9" result(i) = "0" Case Else result(i) = Chr(Asc(result(i)) + 1) Return New String(result) End Select Next i Return New String(result) End Function

Luca

frenk17 Profilo | Junior Member

non mi funziona.... mi passa la stringa senza cambiare nulla...
ho provato con la stringa
AA000001

aiedail92 Profilo | Expert

Non funziona perchè non cambia la stringa che passi, ma ne ottiene una nuova col risultato. Questa è l'unica via perché in .Net le stringhe sono oggetti immutabili. Devi fare così:

Dim next As String = Incrementa("AA000001")

Luca

frenk17 Profilo | Junior Member

ok funziona alla perfezione... grazie mille
ciao ragazzi

0v3rCl0ck Profilo | Guru

>Non funziona perchè non cambia la stringa che passi, ma ne ottiene
>una nuova col risultato. Questa è l'unica via perché in .Net
>le stringhe sono oggetti immutabili. Devi fare così:

Vorrei fare una piccola precisazione, perchè è vero che le stringhe in .Net sono immutabili, ma è possibile fare quello che chiedeva aiedail92. Nella heap è vero che le stringhe una volta create e riassegnate non vengono sovrascritte, ma ne viene creata una nuova, e l'altra lasciata al GC (garbage collector), che la distruggerà o la riutilizzerà. Ma non è assolutamente vero che se passo una stringa ad una funzione, quest'ultima non può essere cambiata a livello logico. Senza entrare nel dettaglio perchè altrimenti bisognerebbe scrivere un intero libro sulla questione, la stringa puoi passarla anche ByRef alla funzione, e quest'ultima vedrai che se viene cambiata nella funzione, anche fuori dallo scope della funzione stessa, sarà modificata. I meccanismi che utilizza .net per eseguire tale operazione, li puoi approfondire su manuali e articoli in internet, cercando:
"Primitive Types" "Reference and Value Types" "Boxing and Unboxing".

Ciao

- Michael -
http://blogs.dotnethell.it/Regulator/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5