Logo JsDir.com [niente]
Bring Your Site To Life!!!
24 Luglio 2008 - 7:35:26 - 147 scripters on-line! - La tua posizione nel sito: StaffScripts/Script050/
BedInLecce
StaffScripts
Convertitore Euro <=> Lire

Autore: Riccardo Data: 27/08/2001 Downloads: 1395 Voto: 1/5 Download P r o v a


Euro convertitore

      Con l'approssimarsi dell'entrata in vigore della moneta unica, può essere utile uno script che consenta la conversione di valuta.
      E' una domanda che da qualche mese viene fatta spesso nel newsgroup, e che ho ricevuto anche in privato.

      Concettualmente è un'operazione semplice, basta dividere o moltiplicare per il tasso di conversione (1 E = 1936.27 Lit.) ed arrotondare.
      Ma gli script che vi presento godono di alcune peculiarità che non mi sembra di aver ancora visto in altre sedi:
  • accettano in ingresso valori di qualunque tipo, sia interi che decimali che vengono comunque controllati prima della conversione;
  • riescono a gestire ed a restituire ben formattati sia valori positivi che negativi;
  • il convertitore da Lire a Euro restituisce sempre e comunque due decimali, anche se sono entrambi zeri, ed il convertitore opposto restituisce sempre un numero intero;
  • è presente una funzione in più che consente anche di rappresentare il valore in uscita con inseriti i separatori delle migliaia: una funzione utile quando il risultato si debba presentare, ad esempio, in un form per dei preventivi;
  • infine: il dato restituito è sempre e comunque una stringa, e viene usata la notazione internazionale per la rappresentazione dei numeri.       Riguardo all'ultimo punto, la prima scelta (dati in uscita sotto forma di stringa) è una scelta forzata dettata sia dalla necessità di rappresentare eventuali zeri significativi prima o dopo il punto decimale, sia dall'eventuale presenza dei separatori delle migliaia.
          La seconda scelta, invece, è dettata dalla caratteristica di "internazionalità" delle pagine Web.
          Un problema che tutti ci troveremo ad affrontare dal primo gennaio sarà la diversa modalità di rappresentare i numeri ai visitatori stranieri. Noi italiani usiamo il punto come separatore delle migliaia, e la virgola come separatore dei decimali. Non è così in altri paesi, negli States ad esempio fanno il contrario, e pur se chi naviga in internet è a conoscenza della cosa (si spera che l'abbia imparato non quando ha cominciato a navigare, ma quando ha iniziato ad usare il PC, anche se Excel non aiuta!) per le nostre pagine web ci si presenteranno tre scelte: continuare ad usare la notazione italiana (magari le pagine sono per il solo pubblico connazionale), convertirci alla notazione "internazionale" (sperando che i nostri non si confondano quando dovranno leggere gli importi), oppure preparare due diverse pagine, una per i "nostri" ed una per "gli altri" (evviva l'Euro! :-)).
          In questi script ho optato per la notazione internazionale, quindi il separatore decimali sarà il punto ed il separatore delle migliaia sarà la virgola. Se avrete altre necessità sarà sufficiente modificare i vari "replace()" presenti negli script.
    Prima che mi scriviate per richieste di modifica delle funzioni, vi avverto che qualsiasi richiesta di modifica ai quattro script di questa scheda, significherà, per me, richiesta di consulenza (a pagamento), mi sembra onesto e giusto considerando che esplicitamene sto consentendo l'uso degli script anche per siti commerciali senza chiedere nulla in cambio che di conservare l'integrità del file .js che li contiene. Script che sono si analoghi a tanti altri che trovate in giro, ma che, credo, sono unici per completezza e funzionalità.

          E veniamo alle funzioni.
          Gli script sono contenuti in un file ".js" esterno, che andrà semplicemente incluso nella pagina HTML con la solita sintassi:
    <SCRIPT SRC="EuroConv.js"></SCRIPT>

          Le istruzioni per l'uso sono contenute nel file .js, quindi è inutile dilungarmici, passo invece ad un breve(!? :-) commento delle quattro funzioni.

          All'interno dello script sono presenti quattro funzioni:
          toEuro(valore[,flag]) - converte da Lire a Euro
          toLire(valore[,flag]) - converte da Euro a Lire
          punti(valore) - inserisce i separatori delle migliaia
          noDot(valore) - elimina i separatori delle migliaia

          [,flag] è un parametro opzionale per i converitori, se presente l'unico valore valido che può assumere è true ed in tal caso, il risultato della conversione, prima di essere restituito, viene passato dalla terza funzione (punti()) per l'inserimento dei separatori delle migliaia.

          Cominciamo dalla prima funzione:
    function toEuro(valore,dots){
      var isOk=false;
      valore=valore.toString().replace(/,/g,"");
      if (!isNaN(valore)){
        isOk=true;
        valore=(Math.round(parseInt(valore)/19.3627)/100).toString();
        valore.indexOf(".")==-1?valore+=".00":valore.substr(valore.indexOf(".")).length==2?valore+="0":null;
        valore.indexOf(".")==0?valore="0"+valore:null;
        valore.indexOf("-.")==0?valore="-0"+valore.substr(1):null}
        else valore="#-- Error --#";
      isOk?dots?valore=punti(valore):null:null;
      return valore
      }
          La prima riga della funzione setta una variabile locale a "false", ci servirà dopo la conversione di valuta per decidere se, nel caso sia richiesto, è possibile inserire i separatori delle migliaia.
          Subito dopo il dato inserito viene convertito in stringa, e vengono eliminate, se ci sono, le virgole (separatori delle migliaia). Quest'ultimo passo può sembrarvi superfluo, ma non lo è se considerate che in un form (di preventivo ad esempio) potreste presentare dei numeri in Lire (con i separatori) e poi in Euro senza preoccuparvi della forma in cui si presenta il dato in ingresso.
          A questo punto viene effettuata la conversione vera e propria. Il dato inserito viene controllato, e se rappresenta un numero la variabile isOk viene impostata a true (quindi sarà possibile alla fine inserire i separatori di migliaia) ed effettuata la conversione.
          Per chi non lo sapesse: isNaN() restituisce "true" se il suo argomento NON è un numero, e con il "!" davanti invertiamo il risultato, quindi verrò restituito true se il dato è un numero.
          Vediamo la conversione vera e propria: il dato viene convertito in intero con parseInt() (gli importi in Lire sono sempre interi) e diviso per 19.3627 (quindi il tasso di conversione moltiplicato per 100), il risultato viene arrotondato (Math.round()) e diviso per 100 (per compensare la moltiplicazione sul tasso). Il risultato viene convertito in stringa prima di essere assegnato alla variabile d'ingresso valore.
          Questo giochetto di moltiplicare e dividere per 100 ci serve per avere nel risultato un massimo di due cifre decimali correttamente arrotondate che sono il numero di cifre significative in valuta europea (i centesimi di euro, quindi il sottomultiplo più piccolo che ci ritroveremo in tasca dal 1° gennaio 2002 sotto forma di monetine).
          La conversione in stringa finale è necessaria, in quanto con la nuova valuta sarà necessario specificare i centesimi sempre e comunque, ma durante la conversione potremmo non ottenere cifre decimali (ad esempio 1.236.270 Lire sono 1.000 Euro) quindi dovremo visualizzare un importo con zero decimi e zero centesimi. La riga successiva si occupa di aggiungere gli zeri che non fossero presenti.
          Per il controllo uso l'operatore ternario ?: di cui ho già avuto modo di dire in altri script, ed il controllo della presenza del punto nel risultato. Il punto, come noto, viene usato in informatica per rappresentare i decimali, dunque se ci sono dei decimali nel risultato ce lo ritroveremo dopo la conversione. Quindi controllo se il punto esiste, se non c'è aggiungo il punto e due zeri al risultato (ricordate che è una stringa), altrimenti, visto che il punto esiste, controllo quanti caratteri ci sono fra il punto e la fine della stringa: se c'è un solo carattere aggiungo un solo zero; se i caratteri dopo il punto sono più di 1 (cioè due perché abbiamo limitato il risultato a due cifre decimali) non faccio modifiche (null).
          La riga precedente, scritta con l'uso del classico if (condizione) {...} else {...} sarebbe:
    if (valore.indexOf(".")==-1)
      valore+=".00";
      else
      if (valore.substr(valore.indexOf(".")).length==2)
        valore+="0";
          Subito dopo verifichiamo se il primo carattere del valore convertito è un punto. Infatti l'interprete JavaScript nel caso il risultato di un'operazione sia compreso fra 0 e 1 non restituisce lo zero prima del punto decimale (che è siginificativo), cioè restituisce ".34" invece di "0.34". Per avere in uscita un numero "reale" dobbiamo fare questo controllo, e se troviamo il punto decimale come primo carattere anteponiamo uno zero alla stringa in uscita.
          Analogamente nella riga successiva, ma questa volta lo zero lo inseriamo fra il segno "meno" ed il punto, qui infatti avremmo, nel caso di numero negativo minore di 1, un valore del tipo "-.34" che convertiremo in "-0.34".
          Tornando allo script: l'else che troviamo a questo punto si riferisce ad if (!isNaN(valore)), quindi se il dato passato alla funzione non era numerico, il convertitore restituirà in uscita un errore.
          La penultima riga effettua l'ultima modifica a valore che a questo punto è il nostro risultato: se la variabile isOk è true viene controllato il parametro dots della funzione, se è stato inserito (ed è true) allora passa il risultato alla funzione punti() che inserirà i separatori delle migliaia.
          return valore chiude la funzione e restituisce il risultato allo script chiamante.

          La funzione successiva effettua la conversione da Euro a Lire:
    function toLire(valore,dots){
      var isOk=false;
      valore=valore.toString().replace(/,/g,"");
      if (!isNaN(valore)){
        isOk=true;
        valore=Math.round(valore*1936.27);}
        else valore="#-- Error --#";
      isOk?dots?valore=punti(valore):null:null;
      return valore
      }
          Non vi starò a tediare con la descrizione di prima, quel che cambia è solo il calcolo per la conversione, infatti qui moltiplichiamo semplicemente per il tasso ed arrotonderemo all'unità, tanto dobbiamo restituire un valore di Lire intero.
          Anche in questo caso, prima di convertire eliminiamo dal dato in ingresso le virgole (separatori delle migliaia) se ci sono, e restituiamo un errore se il dato non è numerico. La variabile isOk funziona allo stesso modo in congiunzione, se presente, con il flag dots per l'inserimento dei separatori delle migliaia al risultato.

          Vediamo la penultima funzione: quella che si occupa di inserire i punti decimali.
          Ho preferito riscriverla invece di usare quella dello script n. 25 (1.000 non più 1000) per snellirla e consentirle di trattare agevolmente numeri negativi e decimali:
    function punti(numero){
       numero=numero.toString();
       dp=numero.indexOf(".")!=-1?numero.substring(0,numero.indexOf(".")).length:numero.length;
       for (i=dp-3;i>0;i-=3)
          numero=numero.substring(0,i)+","+numero.substr(i);
       numero=numero.replace(/-,/,"-");
       return numero
       }
          Dopo aver fatto la solita conversione in stringa, prendiamo nella variabile dp la lunghezza della parte inera del numero in ingresso, o dell'intero numero se non c'è parte decimale.
          Il ciclo successivo si occupa, partendo da destra, di inserire una virgola ogni tre caratteri della parte intera contando le triplette a partire dal quart'ultimo carattere. Il replace() che segue invece effettua una sostituzione solo nel caso il dato in ingresso sia negativo. Infatti in segno - (posizionato nella parte intera) viene trattato dal ciclo come se fosse una cifra, quindi in situazioni del tipo "-100000" ci ritroveremmo in uscita dal ciclo il valore "-,100-000" che dovremmo correggere.
          Il numero così convertito lo restituiamo allo script chiamante.

          L'ultima funzione che ho inserito in questo script è solo una funzione di comodo. Se doveste infatti usare in un vostro script uno dei risultati con i separatori delle migliaia, otterreste un errore, perché la virgola usata come separatore non sarebbe un carattere valido per un numero (se lo provate con isNaN() otterreste false).
    function noDot(numero){
       return parseFloat(numero.replace(/,/gi,""));}
          La funzione noDot() si occupa semplicemente di togliere tutte le virgole usando un replace(), convertire il risultato in numero a virgola mobile e restituire il numero, che a questo punto non sarà più una stringa (come quella che ottenete da un campo TEXT con .value) ma proprio un valore numerico che potrete, ad esempio, moltiplicare direttamente per calcolare uno sconto (che agli italiani piace tanto"! :-))

          Basta così! Con quasi 25KByte di descrizione ho superato il mio record di lunghezza in una pagina web di solo testo (il precedente record era detenuto dal Menu Avvio) quindi mi fermo qui dopo la quarta revisione! :-)))
          Scrivetemi per chiarimenti, ma ricordate l'avviso dato all'inizio se volete delle personalizzazioni (per la serie "non costringetemi a dire di no").
    Riccardo      





Per navigare correttamente il sito è necessario abilitare i cookies.
Enjoy Open Source!
ffx80wh2

    javascript
 
 
 
         Stampa
          Segnala
          Preferiti





ffx1201