Numero Formattato
Moderatore: Moderatori
-
- Messaggi: 3616
- Iscritto il: sabato 7 febbraio 2004, 1:00
- Località: Roma
- Contatta:
Numero Formattato
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.
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
-
- Messaggi: 162
- Iscritto il: sabato 18 marzo 2006, 1:00
- Versione FileMaker: 16
- Sistema operativo: Mac OS X 12 Sierra
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.
PS: il segno "?" sta per "minore-uguale" (problema di conversione caratteri fra Macintosh e server fmpro.it ?)
Grazie di nuovo e cari saluti a tutti.
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
)
)
-
- Messaggi: 9700
- Iscritto il: lunedì 1 dicembre 2003, 1:00
- Località: Roma
- Contatta:
-
- Messaggi: 3616
- Iscritto il: sabato 7 febbraio 2004, 1:00
- Località: Roma
- Contatta:
Ciao Thomas
felicissimo che tu abbia usato ( e modificato per le tue necessità ) due delle mie funzioni personalizzate.
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 )
------------------------------------------
------------------------------------------
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.
felicissimo che tu abbia usato ( e modificato per le tue necessità ) due delle mie funzioni personalizzate.
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.
Raybaudi FMP 12 Adv. Windows XP SP3
-
- Messaggi: 162
- Iscritto il: sabato 18 marzo 2006, 1:00
- Versione FileMaker: 16
- Sistema operativo: Mac OS X 12 Sierra
Caro Rybaudi,
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...) ].
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...
Hai ragione tre volte.Nel farlo, però, hai commesso a mio parere tre errori.
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...) ].
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...
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.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.
Grazie, mi sento debitore di una pizza in piazza Navone!Ti allego una nuova funzione personalizzata che dovrebbe fare al tuo caso !
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ù.ho tralasciato il caso che tu hai imposto quando non vuoi i decimali, cioè quando al numero fai seguire un punto esclamativo
-
- Messaggi: 18
- Iscritto il: martedì 9 gennaio 2007, 1:00
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.
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
-
- Messaggi: 3616
- Iscritto il: sabato 7 febbraio 2004, 1:00
- Località: Roma
- Contatta:
-
- Messaggi: 18
- Iscritto il: martedì 9 gennaio 2007, 1:00
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...
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
-
- Messaggi: 58
- Iscritto il: sabato 7 aprile 2007, 2:00
Anch'io ho notato che con i numeri negativi la funzione "FormattedNumber" da i numeri.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...
Esempio:
numero -1234
formattato -1..'234.99
Filemaker Pro Advanced 9 - Windows Xp Professional SP2