Translate number to letters (JXLTNBR)

Where allowed to run: All environments (*ALL)
Threadsafe: No
Parameters
Examples
Error messages

Command JXLTNBR - Translate number to letters

Comando JXLTNBR - Traduce numero in lettere

Testa la conversione di un numero nella sua descrizione alfabetica restituendo un messaggio in log.

Note: Il programma RPGLE JXLTNBRD costituisce il cuore del comando JXLTNBR ed e' disponibile anche per la chiamata con una tradizionale call, con gli stessi parametri del comando JXLTNBR, o con la funzione sql JXLTNBR, che restituisce la descrizione alfabetica. In realta', per il comando qui documentato, non si prevede un uso diretto produttivo. Esso e' tuttavia il miglior punto di ingresso per questa documentazione e per il test del programma cuore.

Note: Il testo d'aiuto della funzione SQL JXLTNBR e' consultabile sia dal video comandi che dal video SQL con la chiamata: CALL NERONI2/JXLTNBR

Lo scopo del programma cuore JXLTNBRD, ricevuti dal comando i parametri qui illustrati, e' restituire un campo alfanumerico lungo al massimo 200 caratteri contenente la traduzione in lettere del numero ricevuto. Se il programma riesce a produrre una traduzione utilizzabile, il comando visualizza la traduzione nel messaggio di risposta.

Top

Parameters

Keyword Description Choices Notes
NUMBER Number to translate Decimal number Required, Positional 1
LENGTH Translation lenght 11-200, 200 Optional, Positional 2
SEPARATORS Decimal separators Character value, ',', '.', '<EURO>', '+CENT' Optional, Positional 3
CLOSE Close without cents Character value, '<EURO>', '//' Optional, Positional 4
CLOSECENTS Close with cents Character value, *CLOSE, '<CENT>', '//' Optional, Positional 5
LANGUAGE Language ITA, ENG, DEU, FRA, NED, ESP, XXXX Optional, Positional 6
Top

Number to translate (NUMBER)

Numero da tradurre (NUMBER)

Numero da tradurre nella sua descrizione alfabetica.

Sono permesse fino a 12 cifre intere piu' 2 decimali.

Valori permessi:

numero-12-interi-2-decimali
Un numero maggiore di zero.

Il valore e' obbligatorio.

Top

Translation lenght (LENGTH)

Lunghezza della traduzione (LENGTH)

Lunghezza massima richiesta per la descrizione alfabetica da ottenere.

E' permesso indicare una lunghezza compresa tra 11 e 200. Il valore deve essere pero' ragionevolmente adeguato alla dimensione massima del numero da tradurre in lettere, tenendo anche conto delle stringhe di servizio fornite nei parametri SEPARATORS, CLOSE e CLOSECENTS.

Se dopo il primo tentativo la lunghezza del risultato e' eccessiva, avvengono due ulteriori tentativi sacrificando prima la traduzione dei due decimali, poi quella della terna di cifre delle unita'.

Se l'algoritmo non riesce a ottenere una descrizione soddisfacente, segnala il problema lasciando in bianco il risultato e il comando restituisce un diagnostico.

Valori permessi:

200
La lunghezza massima predisposta.
numero-intero-da-11-a-200
Il numero di caratteri disponibili a ricevere il risultato della traduzione, ad esempio sugli assegni bancari dove richiesta la descrizione in lettere dell'importo.
Top

Decimal separators (SEPARATORS)

Separatore decimali (SEPARATORS)

Dicitura da interporre tra la traduzione della parte intera e la traduzione dei centesimi se i decimali sono diversi da zero.

Valori permessi:

dicitura-separatrice-tra-interi-e-decimali
Fino a 14 caratteri da interporre tra interi e decimali. Non permessi spazi intermedi.

Valori speciali:

,
Virgola decimale, logica numerica.
.
Punto decimale, logica numerica.
<EURO>
Euro, logica valuta post.
+CENT
Centesimi, logica valuta ante
Top

Close without cents (CLOSE)

Chiusura senza decimali (CLOSE)

Dicitura da accodare alla traduzione della parte intera quando i decimali sono a zero.

Valori permessi:

dicitura-da-accodare-agli-interi-senza-decimali
Fino a 14 caratteri da accodare agli interi senza decimali. Non permessi spazi intermedi.

Valori speciali:

(nulla)
Nulla, logica numerica.
<EURO>
Euro, logica valuta post.
//
Sbarratura, logica valuta ante.
Top

Close with cents (CLOSECENTS)

Chiusura con decimali (CLOSECENTS)

Dicitura da accodare alla traduzione della parte intera quando sono presenti anche i decimali.

Valori permessi:

dicitura-da-accodare-agli-interi-con-decimali
Fino a 14 caratteri da accodare agli interi con decimali. Non permessi spazi intermedi.

Valori speciali:

*CLOSE
Viene sostituito con il valore del parametro CLOSE.
<CENT>
Euro, logica valuta post.
//
Sbarratura, logica valuta ante.
Top

Language (LANGUAGE)

Lingua (LANGUAGE)

Lingua da usare nella traduzione del numero in lettere.

Valori permessi:

ITA
Viene usata la lingua italiana.
ENG
Viene usata la lingua inglese.
DEU
Viene usata la lingua tedesca.
FRA
Viene usata la lingua francese.
NED
Viene usata la lingua olandese.
ESP
Viene usata la lingua spagnola.
XXXX
Valore presente solo per testare la risposta negativa del programma cuore JXLTNBRD.
Top

Esempi per JXLTNBR

Esempio 1: Uso del comando estemporaneo per verificare la traduzione di un numero

Chiamando il comando JXLTNBR con alcuni numeri e varie opzioni si ottiene il seguente log, moderatamente reimpaginato per migliorarne la leggibilita':

Un numero molto lungo
> JXLTNBR NUMBER(454454454454,54)
  quattrocentocinquantaquattromiliardiquattrocentocinquantaq
    uattromilioniquattrocentocinquantaquattromilaquattrocent
    ocinquantaquattro,cinquantaquattro
Lo stesso numero in tutte le lingue
> JXLTNBR NUMBER(12345,67)
  dodicimilatrecentoquarantacinque,sessantasette
> JXLTNBR NUMBER(12345,67) LANGUAGE(ENG)
  twelvethousandthreehundredfortyfive,sixtyseven
> JXLTNBR NUMBER(12345,67) LANGUAGE(FRA)
  douzemilletroiscentquarantecinq,soixantesept
> JXLTNBR NUMBER(12345,67) LANGUAGE(DEU)
  zwoelftausenddreihundertfuenfundvierzig,siebenundsechzig
> JXLTNBR NUMBER(12345,67) LANGUAGE(ESP)
  docemiltrescientoscuarentaycinco,sesentaysiete
> JXLTNBR NUMBER(12345,67) LANGUAGE(NED)
  twaalfduizenddriehonderdvijfenveertig,zevenenzestig
> JXLTNBR NUMBER(12345,67) LANGUAGE(XXXX)
  La lingua richiesta XXXX non e' prevista. Ho usato ITA
  dodicimilatrecentoquarantacinque,sessantasette
Stringe la lunghezza desiderata
> JXLTNBR NUMBER(12345,67) LENGTH(45) LANGUAGE(ITA)
  dodicimilatrecentoquarantacinque,67
> JXLTNBR NUMBER(12345,67) LENGTH(30) LANGUAGE(ITA)
  dodicimila345,67
> JXLTNBR NUMBER(12345,67) LENGTH(15) LANGUAGE(ITA)
  La descrizione ottenibile e' piu ampia della lunghezza
    massima richiesta oppure la conversione in lettere
    e' terminata in errore.
Usa le costanti descrittive con strategia post
> JXLTNBR NUMBER(12345,67) SEPARATORS('<EURO>')
  CLOSE('<EURO>') CLOSECENTS('<CENT>') LANGUAGE(ITA)
  dodicimilatrecentoquarantacinque<EURO>sessantasette<CENT>
> JXLTNBR NUMBER(12345) SEPARATORS('<EURO>') CLOSE('<EURO>')
  CLOSECENTS('<CENT>') LANGUAGE(ITA)
  dodicimilatrecentoquarantacinque<EURO>
Usa le costanti descrittive con strategia ante
> JXLTNBR NUMBER(12345,00) SEPARATORS('+CENT') CLOSE('//')
  dodicimilatrecentoquarantacinque//
> JXLTNBR NUMBER(12345,67) SEPARATORS('+CENT') CLOSE('//')
  dodicimilatrecentoquarantacinque+CENTsessantasette//

Si osservino i messaggi risultanti.

Esempio 2: Uso del programma cuore JXLTNBRD per tradurre un numero in lettere mediante CALL

Si riporta uno stralcio del sorgente RPGLE JXLTNBRS che esemplifica la chiamata al programma cuore del controllo mediante la definizione di una procedure RPG. Per gli incolonnamenti giusti e per maggiore dettaglio, consultare il sorgente stesso.

 *----------------------------------------------------------
 * Claudio Neroni 30-05-2017 Creato.
 * JXLTNBRS
 * Translate number to letters. Tst Callp Expr Short
 * Definisce la procedura senza programma esterno.
 * Usa la CALLP implicita che puo' stare nelle espressioni.
 * Il campo risultante e' prelevato dalla funzione.
 * Nella procedure il pgm originale viene chiamato con CALL.
 *----------------------------------------------------------
H DFTACTGRP(*NO)
D  let            ds           200             O Translation
D    let1                       50
D    let2                       50
D    let3                       50
D    let4                       50
D  stop           s              1    inz('X') U Stop dsply
C  *entry plist
 * Riceve il numero da tradurre.
 *    Ad esempio, per tradurre il numero 12345,67 eseguire:
 *   call JXLTNBRS x'000000001234567f'
 C        parm              nbr       14 2
 /free
  let = jxltnbr (nbr:200:',':' ':' ':'ITA');
  *inlr=*on;
  dsply let1;
  dsply let2;
  dsply let3;
  dsply let4 ' ' stop;
 /end-free
 *----------------------------------------------------------
P jxltnbr         b
D jxltnbr         pi           200a
D  Jlegnr                       14p 2 const    I Number
D  Jlegle                        3p 0 const    I Lenght
D  Jlegse                       14a   const    I Separators
D  Jlegcl                       14a   const    I CloseNoCent
D  Jlegcc                       14a   const    I CloseCent
D  Jlegln                        4a   const    I Language
D jxltnbrout      s            200a            O Translation
C            call      'JXLTNBRD'
C            parm      jlegnr  plegnr  14 2    I Number
C            parm      jlegle  plegle   3 0    I Lenght
C            parm      jlegse  plegse  14      I Separators
C            parm      jlegcl  plegcl  14      I CloseNoCent
C            parm      jlegcc  plegcc  14      I CloseCent
C            parm      jlegln  plegln   4      I Language
C jxltnbrout parm              plegxl 200      O Translation
C            return    jxltnbrout
P jxltnbr         e
*-----------------------------------------------------------

Il significato dei campi e' lo stesso che si legge nel testo d'aiuto dei parametri del comando JXLTNBR.

L'esecuzione della chiamata:
> call JXLTNBRS x'045445445445454f'
genera la seguente visualizzazione:
DSPLY  quattrocentocinquantaquattromiliardiquattrocentoci
DSPLY  nquantaquattromilioniquattrocentocinquantaquattrom
DSPLY  ilaquattrocentocinquantaquattro,cinquantaquattro
DSPLY                                                      X

Per altri esempi d'uso RPGLE, consultare il sorgente dei programmi JXLTNBRS0, JXLTNBRS1, JXLTNBRS2, JXLTNBRS3, JXLTNBRS4. Alcuni di questi usano come /COPY i sorgenti JXLTNBR1 e JXLTNBR2, utili per l'uso delle procedure RPG.

Esempio 3: Uso della funzione SQL JXLTNBR

Si riporta un adattamento del testo d'aiuto della funzione SQL JXLTNBR che usa il programma RPGLE JXLTNBRD, cuore dell'ambaradan.

Sql function JXLTNBR
Translate number to letters
Traduce numero in lettere
-
 La funzione riceve tre parametri:
   1) Un numero da tradurre in lettere
      costituito da 14 cifre di cui 2 decimali;
      sono tollerati da 1 a 12 interi e da 0 a 2 decimali.
   2) La lunghezza in 3 cifre dello spazio a
      disposizione per contenere la traduzione in lettere;
      la lunghezza massima deve essere tra 11 e 200.
   3) Un alfanumerico con due valori:
      Nei primi tre caratteri la lingua in cui tradurre,
      con esempi per 12,31.
       ITA = Italiano   dodici,trentuno
       ENG = Inglese    twelve,thirtyone
       DEU = Tedesco    zwoelf,einunddreissig
       FRA = Francese   douze,trenteun
       NED = Olandese   twaalf,eenendertig
       ESP = Spagnolo   doce,treintayuno
      Nel quarto carattere il nome della batteria
      di costanti che editano la descrizione,
      con esempi per 12 e 12,31.
       0 = Punto   dodici         dodici.trentuno
       1 = Virgola dodici         dodici,trentuno
       2 = Post    dodici<EURO>   dodici<EURO>trentuno<CENT>
       3 = Ante    dodici//       dodici+CENTtrentuno//
      Altre batterie potranno essere aggiunte se necessario.
 -
 La funzione restituisce un valore di 200 caratteri:
   Traduzione in lettere del numero ricevuto
   editata come da lunghezza e costanti richieste.
 -
 La funzione SQL e' stata sviluppata inizialmente per il
 release V7R2 che interpreta come char la costante tra
 apici fornita alla funzione come dagli esempi seguenti.
 Purtroppo pero' il release V7R1 riconosce la stessa
 costante come varchar che comporta l'aggiunta automatica
 di un integer iniziale di due byte a prefissare la
 costante.
 Ne seguono evidenti difficolta' interpretative da parte
 del programma esecutore della funzione tra un release
 e l'altro.
 Deciso di risolvere il release piu' recente,
 per sanare il problema nel piu' vecchio, due vie:
 A) Caricare il valore in una variabile di ambiente
    e passare la variabile in luogo della costante.
    Ad esempio, per creare una variabile:
    create variable LANGEDIT char(4);
    Per riempire la medesima variabile:
    set LANGEDIT = 'FRA2';
    Di striscio, per vedere la variabile:
    select * from (values(LANGEDIT)) variables(LANGEDIT);
    Invece quindi della semplice costante, ad esempio
    'FRA2'
    si passa alla funzione la variabile
    LANGEDIT
 B) Invece della semplice costante, ad esempio
    'ESP2'
    passare alla funzione il piu' complesso
    cast('ESP2' as char(4))
 -
 Si riporta un primo esempio da V7R2 di chiamata sui dati
 del file di test:
    SELECT t1nbr1,
    jxltnbr(t1nbr1, 200, 'ITA1')
    FROM jxltnbrt1;
 Oppure per V7R1, versione cast:
    SELECT t1nbr1,
    jxltnbr(t1nbr1, 200, cast('ITA1' as char(4)))
    FROM jxltnbrt1;
 Oppure per V7R1, versione variabile:
    set LANGEDIT = 'ITA1';
    SELECT t1nbr1,
    jxltnbr(t1nbr1, 200, LANGEDIT)
    FROM jxltnbrt1;
 Si genera il seguente output:
    Numero   JXLTNBR
    14,2
     12,00   dodici
     12,31   dodici,trentuno
 12.345,67   dodicimilatrecentoquarantacinque,sessantasette
       ...
 Un secondo, per troncare la traduzione a 45 caratteri:
    SELECT t1nbr1,
    substr(jxltnbr(t1nbr1, 45, 'ITA1'), 1, 45)
    FROM jxltnbrt1;
 Oppure per V7R1 versione cast:
    SELECT t1nbr1, substr
    (jxltnbr(t1nbr1, 45, cast('ITA1' as char(4))), 1, 45)
    FROM jxltnbrt1;
 Si genera il seguente output:
    Numero   JXLTNBR
    14,2
     12,00   dodici
     12,31   dodici,trentuno
 12.345,67   dodicimilatrecentoquarantacinque,67
       ...
 Si osservi che il campo di output contenente la traduzione
 e' troncato alla stessa lunghezza richiesta nella funzione.
 Si osservi inoltre che l'algoritmo ha rinunciato
 alla traduzione dei decimali di 12.345,67
       ...
 Senza piu' dettagliare per V7R1,
 un terzo, per troncare la traduzione a 30 caratteri:
    SELECT t1nbr1,
    substr(jxltnbr(t1nbr1, 30, 'ITA1'), 1, 30)
    FROM jxltnbrt1
 Si genera il seguente output:
    Numero   JXLTNBR
    14,2
     12,00   dodici
     12,31   dodici,trentuno
 12.345,67   dodicimila345,67
       ...
 Si osservi che l'algoritmo ha rinunciato anche alla
 traduzione delle terna delle unita' di 12.345,67
 -
 Un quarto, per troncare la traduzione a 15 caratteri:
    SELECT t1nbr1,
    substr(jxltnbr(t1nbr1, 15, 'ITA1'), 1, 15)
    FROM jxltnbrt1
 Si genera il seguente output:
    Numero   JXLTNBR
    14,2
     12,00   dodici
     12,31   dodici,trentuno
 12.345,67
       ...
 Si osservi che l'algoritmo ha rinunciato completamente
 alla traduzione di 12.345,67
 -
 La visualizzazione del presente testo e' ottenibile dal
 video comandi o dal video SQL con:
    CALL NERONI2/JXLTNBR

Top

Messaggi informativi e di completamento

Messaggi *INFO e *COMP

JXN0191
&1

Messaggi di errore

Messaggi *DIAG seguiti da *ESCAPE CPF0001

Nessun messaggio previsto.

Messaggi *DIAG non seguiti da *ESCAPE

JXN0101
La lingua richiesta &1 non e' prevista. Ho usato &2
JXN0102
La descrizione ottenibile e' piu ampia della lunghezza massima richiesta oppure la conversione in lettere e' terminata in errore.
Top