Newsgroup: it.comp.www.php
Titolo: Creazione stringa di caratteri

Ciao a tutti, ho un problema nellla creazione di una stringa di
caratteri:
ho una variabile:
strftime("%Y%m%d%H%M%S")
e un'altra variabile $numero che può avere valori da 0 a 100000000
ecc...
io vorrei creare una stringa di 20 caratteri con
strftime("%Y%m%d%H%M%S") e per i restanti
se strftime("%Y%m%d%H%M%S") + $numero non raggiunge il massimo dei 20
caratteri aggiungere 00 prima di  $numero
se strftime("%Y%m%d%H%M%S") + $numero supera i 20 caratteri, togliere
i caratteri in più (ma all'inizio di $numero
mi aiutate??
Grazie

strftime("%Y%m%d%H%M%S") e per i restanti
Se ti serve per farci un ID o un codice bolla o qualcosa del genere, ti
troverai messo molto meglissimo :-) a fare una cosa tipo
	$codice = date('YmdHis') . printf("%06d", $numero);
...e cosi' il numero va da 0 a 999999.
Mettendo solo le ultime due cifre dell'anno, arrivi fino a 100 milioni,
che dovrebbero bastare per chiunque, come disse qualcuno parlando della
memoria da 640K :-).
Oppure potresti usare solo anno mese giorno, e ti restano 12 cifre.
In tutti questi casi, i codici che ottieni sono ordinabili. Come dicevi
tu invece il primo codice è 00000201101010101011, il 999999-esimo sara'
qualcosa come 20121220143317999999, e quello dopo 01212201433171000000:
che intanto comincia per zero, ed è lessicograficamente e numericamente
INFERIORE al codice che lo precede.
Se ti serve un ID univoco, uniqid() is your friend.
Quello che chiedi tu comunque si può riassumere in:
	a) Concatenare strftime e il numero;
	b) Se strlen(risultato) < 20, aggiungerci in coppa
	   zeri q.b. (e questo lo fai con str_pad() ).
	c) Se strlen(risultato) > 20, prendere gli ultimi 20 caratteri
	   (e questo lo fai con substr() ).
Per str_pad e substr, leggi bene le opzioni esoteriche sul manuale, in
particolare i valori negativi dei parametri. Alla fine puoi fare tutto
senza neanche bisogno di if/then/else e di strlen.
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

Grazie mille, che differenza c'è tra la tua e a mia ipotesi??
$codice = date('YmdHis') . printf("%06d", $numero);
mi spiego, io vorrei un valore di 20 caratteri, che contenga prima un
datetime (con anno a 2 cifre) poi un "_" (scusa mi per dimenticata) e
per i caratteri restanti, riempire tutti gli spazi partendo da una
variabile che può assumere valori da 0 a "non so"
ma il mio $codice deve essere di 20 caratteri e alfanumerico (per
questo ho aggiunto un "_").
mi potete aiutare?? io mi sono incasinata :(

mi potete aiutare?? io mi sono incasinata :(
In effetti. A volte parli di te stess' al maschile :-D


Hai ragione, ottimo approccio
Io devo passare ad una pagina un valore univoco di 20 caratteri
(alfanumerici... non solo numeri!! serve almeno un carattere)
tanto per iniziare ho il numero del documento, del tipo
1
2
..
121
..
13.123
....
145.454
....
1.234.432
(quindi con "." come separatore migliaia)
 non sono sicuro che ogni anno la numerazione inizi da zero.... quindi
vorrei trovare un altro modo per generare un valore univoco.... per
questo avevo pensato al datetime (now)
grazie!

tanto per iniziare ho il numero del documento, del tipo
Okay. Stai cercando un sistema per avere un UniqueID del documento, e
probabilmente anche di risalire dall'UniqueID al documento.
Ora: perche' l'ID deve essere proprio di 20 caratteri?


Perchè devo passarlo ad un WS che richiede un valore di 20 chr
alfanumerici
nel mio valore di 20chr devo avere il codice del mio documento e deve
essere univoco.... quindi mi serve il timestamp in quanto negli anni
successivi potrei avere numeri di documento già usati
Thanks

alfanumerici

Mi pare che il sistema piu' semplice sia quello di usare quattro
caratteri per l'anno, e il resto per il codice documento.
	$codice = printf("%04d%016s",
		date('Y'),
		// Estrae i soli numeri dal codice documento
		preg_replace('[^0-9]','',$codice_documento));
Mantiene l'ordine lessicografico standard, e due documenti hanno
codice1 > codice2 sse il primo e' piu' recente del secondo.
Per risalire dal codice al codice documento, usi number_format()
per ripristinare i separatori delle migliaia.


Perchè devo passarlo ad un WS che richiede un valore di 20 chr
alfanumerici
nel mio valore di 20chr devo avere il codice del mio documento e deve
essere univoco.... quindi mi serve il timestamp in quanto negli anni
successivi potrei avere numeri di documento già usati
Thanks

Non posso usare solo l'anno.... perchè lo stesso WS potrebbe essere
usato da altre società, quindi altri potrebbero usare quel'anno +
numero doc
meglio usare il TS (magari usando due cifre per l'anno per ottimizzare
gli spazi)
credo che la soluzione ideale sia quella che avevo ipotizzando, avendo
l'accortezza di riempire o togliere caratteri dal numero documento se
"non riempie" o "eccede" il limite dei 20 caratteri!
potresti aiutarmi?
Thanks

l'accortezza di riempire o togliere caratteri dal numero documento
E se, per usare le tue parole, "altri usano quell'anno + numero doc"
- che succede? Che hai ugualmente una collisione. Non esiste modo di
"distinguere" fra il documento 11 012.345.678.901 della ditta A e il
documento 11 012.345.678.901 della ditta B.
La soluzione allora e' aggiungere un identificativo per la societa'.
I due documenti diventerebbero A11-012345678901 e B11-012345678901 e
si vede subito che sono diversi.
Ragionevolmente, non credo che una ditta... a meno che tu lavori per
la Pubblica Amministrazione... generi in un anno piu' di un miliardo
di documenti. Si va da 000000001 a 999999999, e sono nove cifre.
Aggiungine due per l'anno, e magari all'inizio tre per la societa' -
da AAA a ZZZ sono oltre 17mila codici possibili - e, abbondiamo, due
con dentro il codice nazione. Arrivi a 15 simboli alfanumerici e hai
coperto l'intero pianeta, gestendo 17mila ditte per ogni nazione, ed
ogni ditta puo' generare un miliardo di documenti l'anno di qui fino
al 2099.
Con quei cinque simboli in piu' arrivi al diecimila dopo Cristo, con
mille miliardi di documenti annui gestibili. O sempre al 2099, pero'
gestendo diciotto milioni di aziende.
Ora, onestamente e senza offesa: non e' che tu mi sembri l'impiegato
di una ditta di software che ha un mercato di questo genere.



my2cents
in qualunque linguaggio tu voglia...è solo un problema di costruzione 
del codice parlante
una ipotesi
XX anno (se parti dal 2000...quindi 01 11 12 13....arrivi fino al 2099 
ti basta?)
YY azienda(99 aziende ti bastano? altrimenti incrementa 999 9999?)
Z(facoltativo ...se vuoi gestire una numerazione ramificata...ad esempio 
A=magazzino di Roma B=Magazzino di Firenze etc etc...oppure per il 
trattino o lo slash)
nn tutto il resto numero progressivo "zero filled"
Quindi
1022A000000000012345  = anno 2010 Azienda 22 Magazzino A documento 12345
oppure
1145-000000000634523  = anno 2011 Azienda 45 documento 634523
lo metti come indice nel database(qualsiasi db) con vincolo di 
univocità...fatto!
esisterà soltanto un
1145-000000000634523
e potrà esistere un
1045-000000000634523
1245-000000000634523
1345-000000000634523
oppure non azzerare mai...anche se credo non sia fiscalmente corretto!
  Hai voglia a fare bolle e fatture!!!
-- 
------------------------------
Wodka40 Thunderbirizzato
Wodka si è pure facebookkizzato
http://www.facebook.com/Wodka40
In omaggio ai primi 10 amici un pullover di
lana ombellicale di "Giggi er sozzo"