Numero Formattato

E' l'area in cui è possibile condividere funzioni personalizzate nate dalla creatività e l'esperienza degli sviluppatori FileMaker

Moderatore: Moderatori

raybaudi
Messaggi: 3616
Iscritto il: sabato 7 febbraio 2004, 1:00
Località: Roma
Contatta:

Numero Formattato

Messaggio da raybaudi » venerdì 17 marzo 2006, 0:28

Ciao a tutti

Per chi ha bisogno di formattare un numero con i separatori delle migliaia e dei decimali, e volendo di colorare di rosso i numeri negativi.

Pur essendo un campo testo accetterà solo caratteri numerici, il segno + ed il segno - , la virgola ed il punto.

Ai fini pratici si comporterà come un qualsiasi campo numero.

Codice: Seleziona tutto

/*

FormattedNumber custom function

Author: 
Daniele Raybaudi

Format:
FormattedNumber ( number ; thousandSep ; red )

Parameters:
number - any number or  number field
thousandSep - the your choice thousand separator (decimal separator is given by your system settings) 
red - boolean number - if the number is a negative one and this parameter is  ≠ 0, the result will be red writed

Returns any gived number as a number formatted with thousand and decimal separators.
Also you can choose to dispay the result in red if the number is a negative one.
Better than other custom functions because this isn't limited to some separators and don't need sub custom.

March 16, 2006

*/

Let ([
negative = If ( Length ( Filter ( number; "-" )) and number ; 1; 0 );
num = Abs ( number );
int = Int ( num );
dec = num - int ;
len = Length ( int );
tris =
Case ( 
len > 3 and dec ; thousandSep & Right ( int ; 3 ) & dec;
len ≤ 3 and dec ; Right ( int ; len ) & dec;
len > 3 ; thousandSep & Right ( int ; 3 ) ;
Right ( int ; len )
);
next = Left ( int ;  len - 3 );
result = Case (
len  ; FormattedNumber ( next ; thousandSep ; red ) &  tris ;
""
)
];
Case (
negative and red;TextColor ( "-" & result; RGB ( 255 ; 0 ; 0 ) );
negative;"-" & result;
result
)
)
Raybaudi FMP 12 Adv. Windows XP SP3

Thomas
Messaggi: 162
Iscritto il: sabato 18 marzo 2006, 1:00
Versione FileMaker: 16
Sistema operativo: Mac OS X 12 Sierra

Messaggio da Thomas » venerdì 26 maggio 2006, 9:45

Ringrazio Daniele che mi ha risparmiato un po' di lavoro. A titolo di (parziale) controprestazione pubblico questa versione modificata per considerare la formattazione di numeri da usare per importi in moneta (franchi svizzeri, euro, ecc.). La differenza principale rispetto alla versione originale sta nella trattazione delle cifre decimali che sono sempre 2: in caso di cifre intere si considerano sempre 2 zeri (es. 2000 diventa 2'000.00, oppure 969.9 diventa 969.90). Per quest'ultimo effetto ho approfittato di un'altra fatica di Daniele: FixedLength. Inoltre ho tralasciato i parametri "Thousandsep" che nel caso in esame è sempre "'" e il parametro "red", visto che non uso i colori. Evidentemente queste sono scelte che ognuno può fare liberamente.
Grazie di nuovo e cari saluti a tutti. :lol:

Codice: Seleziona tutto

/* 

ImportoMoneta custom function 

Author: 
Daniele Raybaudi (original version: FormattedNumber)
modified by Thomas Arn

Format: 
ImportoMoneta ( number ) 

Parameters: 
number - any number or  number field 

External function:
FixedLength ( text ; char ; charsNumber ; align ) 

Returns any gived number as a number formatted with thousand and decimal separators. 
The fractional part is returned as fixed length two digit string filled with "0".
Better than other custom functions because this isn't limited to some separators and don't need sub custom. 

March 16, 2006 
May 25, 2006

*/ 

Consenti ([ 
ThousandSep = "'";
rep = If(Lunghezza(Filtro(number;"!")) ; 1 ; 0);
negative = If ( Lunghezza ( Filtro ( number; "-" )) and number ; 1; 0 ); 
num = Assoluto ( RicavaComeNumero(number )); 
int = Intero ( num ); 
dec = If (num - int > 0;FixedLength(num - int; "0"; 3; "Left");".00");
len = Lunghezza ( int ); 
tris = 
Casi ( 
len > 3 and not rep; thousandSep & Destra ( int ; 3 ) & dec; 
len ? 3 and not rep; Destra ( int ; len ) & dec; 
len > 3 and rep; thousandSep & Destra ( int ; 3 ) ; 
Destra ( int ; len ) 
); 
next = Sinistra ( int ;  len - 3 ) & "!"; 
result = Casi ( 
len  ; ImportoMoneta ( next) &  tris ; 
"" 
) 
]; 
Casi ( 
negative;"-" & result; 
result 
) 
)
PS: il segno "?" sta per "minore-uguale" (problema di conversione caratteri fra Macintosh e server fmpro.it ?)

stregatto
Messaggi: 9700
Iscritto il: lunedì 1 dicembre 2003, 1:00
Località: Roma
Contatta:

Messaggio da stregatto » venerdì 26 maggio 2006, 18:09

PS: il segno "?" sta per "minore-uguale" (problema di conversione caratteri fra Macintosh e server fmpro.it ?)
infatti, ti conviene usare >= per minore o uguale e <= per maggiore o uguale.

.g.

book
Messaggi: 703
Iscritto il: lunedì 5 gennaio 2004, 1:00

Messaggio da book » venerdì 26 maggio 2006, 19:25

x stregatto
così ci incasiniamo di più. :wink:
meglio come ha scritto Thomas.

saluti
Riccardo

raybaudi
Messaggi: 3616
Iscritto il: sabato 7 febbraio 2004, 1:00
Località: Roma
Contatta:

Messaggio da raybaudi » lunedì 29 maggio 2006, 1:55

Ciao Thomas

felicissimo che tu abbia usato ( e modificato per le tue necessità ) due delle mie funzioni personalizzate. :wink:

Nel farlo, però, hai commesso a mio parere tre errori.

Il primo è opinabile ... hai creato una funzione che necessita di un'altra funzione; e io cerco invece SEMPRE di evitarlo.

Il secondo è invece meno opinabile ... hai inserito di forza il valore ".00" considerando che il separatore dei decimali sia sempre il punto, ma tu sai che non è sempre così.

Il terzo è molto più grave... se inserisci dei decimali separati dalla virgola, questa verrà mantenuta ( invece di diventare un punto ); se invece inserisci un punto come separatore, il risultato sarà ancora più disastroso.

Ti allego una nuova funzione personalizzata che dovrebbe fare al tuo caso !

( ho tralasciato il caso che tu hai imposto quando non vuoi i decimali, cioè quando al numero fai seguire un punto esclamativo )

------------------------------------------

ImportoMoneta2 ( number )

------------------------------------------

Codice: Seleziona tutto

Let ([
thousandSep = "'" ;
int = Int ( number ) ;
len = Length ( int ) ;
next = Left ( int ; len - 3 ) ;
tris = If ( len > 3 ; thousandSep & Right ( int ; 3 )  ; Right ( int ; len )  ) ;
num = Left ( number + 1/1000; Length ( number + 1/1000 )  - 1 ) ;
dec = Substitute ( Middle ( num ; len + 1 ; 3 ); Left ( Middle ( num ; len + 1 ; 3 ); 1 ) ; "." ) 
];
Case (
len ; Substitute ( ImportoMoneta2 ( next ) ; Substitute (  Left ( 1/1000 ; 3 ) ; Left (  Left ( 1/1000 ; 3 ); 1 ) ; "." ) ; "" ) & tris & dec ;
"" 
) 
)
------------------------------------------

Questa funzione, così com'è, è indipendente dal sistema operativo e dalle impostazioni internazionali presenti sul proprio PC...

Quindi, qualsiasi sia il separatore dei decimali in uso, questo verrà tramutato in punto. :wink:
Raybaudi FMP 12 Adv. Windows XP SP3

Thomas
Messaggi: 162
Iscritto il: sabato 18 marzo 2006, 1:00
Versione FileMaker: 16
Sistema operativo: Mac OS X 12 Sierra

Messaggio da Thomas » lunedì 29 maggio 2006, 16:49

Caro Rybaudi,
Nel farlo, però, hai commesso a mio parere tre errori.
Hai ragione tre volte. :oops:

Ho qualche scusante, anche se lasciano il tempo che trovano:

1) Il problema concreto nasce da una mancanza di FileMaker in riguardo alla formattazione dei numeri quando si trasformano in testo.
Mentre i campi si possono impostare come si vogliono e tutto funziona perfettamente (compreso il separatore delle migliaia e le virgole o i punti...), diverso è il discorso se si deve comporre una stringa di testo da usare ad esempio in "Mostra finestra personalizzata" oppure in "Imposta testo descrizione" per quelle utilissime etichette volanti "click-on-mouse-over". La funzione RicavaComeTesto non aiuta molto. Da qui la necessità, da te da tempo riconosciuta, di costruire alcune funzioni per sopperire a questa lacuna.
[Certo che ai bei tempi del FORTRAN con un F10.2 si liquidava il tutto (anche se mancavano i separatori delle migliaia...) :roll: ].

2) Sto facendo un lavoro abbastanza grosso, con grande pressione sui tempi, dove non faccio concessioni sull'integrità della banca dati, perché la struttura dei dati deve essere duratura e solida.
Per quanto riguarda l'interfaccia utente, invece, ogni tanto mi concedo qualche soluzione del tipo "quick-and-dirty" per le parti non vitali dell'applicazione, proprio per non perdere tempo. Trattandosi di aspetti secondari, questi possono essere migliorati man mano, a seconda delle necessità.
Proprio per trovare velocemente una soluzione, apprezzo questo forum e altre fonti di informazione internet che mi permettono di non dovere riinventare la ruota ogni volta... :lol:
Il terzo è molto più grave... se inserisci dei decimali separati dalla virgola, questa verrà mantenuta ( invece di diventare un punto ); se invece inserisci un punto come separatore, il risultato sarà ancora più disastroso.
Su questo punto hai ragione in generale, se si vuole formattare un numero inserito manualmente, quando bisogna prevedere tutti i maledetti casi degli utenti più fantasiosi. Ma nel mio caso, sapendo che il numero che devo formattare è calcolato dall'applicazione e non introdotto manualmente, sono sicuro che (separatore "'" e virgola ".") la formattazione avviene tranquillamente, senza dover tener conto di situazioni esotiche. :wink:
Ti allego una nuova funzione personalizzata che dovrebbe fare al tuo caso !
Grazie, mi sento debitore di una pizza in piazza Navone! :lol:
ho tralasciato il caso che tu hai imposto quando non vuoi i decimali, cioè quando al numero fai seguire un punto esclamativo
Nella versione originale, questo "trucchetto" (sempre della serie "quick-and-dirty") era necessario per evitare un punto non voluto per i numeri > 999 che utilizzano la medesima funzione in modo ricorsivo per i pacchetti di tre numeri ("tris"). Con la nuova funzione hai ovviato a questo problema, per cui questa esigenza non c'è più.

grimorg80
Messaggi: 18
Iscritto il: martedì 9 gennaio 2007, 1:00

Messaggio da grimorg80 » martedì 16 gennaio 2007, 15:13

Salve!
Ho utilizzato la funzione rimodificata da entrambi, ma questo mi ha creato degli errori di calcolo.

Moltiplicando infatti il valore "trattato" dalla funzione, i due decimali "00" vengono trattati come decine e unità e non come decimali.

Qualche consiglio?

EDIT

Per ora ho risolto applicando al contrario la funzione.
Filemaker 8.5 Pro Advanced su OS X Tiger

raybaudi
Messaggi: 3616
Iscritto il: sabato 7 febbraio 2004, 1:00
Località: Roma
Contatta:

Messaggio da raybaudi » martedì 16 gennaio 2007, 16:52

Ciao

se hai utilizzato la funzione personalizzata:

ImportoMoneta2 ( number )

devi fare attenzione al fatto che Thomas necessitava di un punto, come separatore tra interi e decimali.

Quale è la tua reale esigenza ?
Raybaudi FMP 12 Adv. Windows XP SP3

grimorg80
Messaggi: 18
Iscritto il: martedì 9 gennaio 2007, 1:00

Messaggio da grimorg80 » mercoledì 24 gennaio 2007, 17:02

Devo poter formattare tutti i numeri che rappresentano "denaro" per essere utilizzati per stampare delle fatture.

In realtà, il problema a cui mi riferivo prima non è reale, era una errata impostazione della funzione e dei calcoli.

Un errore però c'è ed è l'utilizzo con numeri negativi, probabilmente per il fatto che il - non viene considerato nel conteggio dei caratteri...
Filemaker 8.5 Pro Advanced su OS X Tiger

permax
Messaggi: 58
Iscritto il: sabato 7 aprile 2007, 2:00

Messaggio da permax » martedì 28 agosto 2007, 20:46

grimorg80 ha scritto:Un errore però c'è ed è l'utilizzo con numeri negativi, probabilmente per il fatto che il - non viene considerato nel conteggio dei caratteri...
Anch'io ho notato che con i numeri negativi la funzione "FormattedNumber" da i numeri.

Esempio:
numero -1234
formattato -1..'234.99
Filemaker Pro Advanced 9 - Windows Xp Professional SP2

Rispondi