Formattare cifre e date

di il
35 risposte

Formattare cifre e date

Salve,
mi ritrovo alle prese con l'ultimo di una montagna di problemi.
In questo caso il db2 con colonna di tipo DECIMAL mi restituisce una cifra con formattazione 1234.56
a me servirebbe il punto per le migliaia e la virgola per i due decimali, quindi 1.234,56
questa formattazione va fatta direttamente nella query o lato java? immagino sia meglio la prima soluzione, cosa ne dite?
So che ci sono delle funzioni, ma non riesco a scriverla correttamente, considerando che potrebbe tanto selezionare 500 tanto un 11.345,09
in che modo considerando che potrei avere un intero , come un decimale, come migliaia o solo centinaia? Grazie

35 Risposte

  • Re: Formattare cifre e date

    Se ti serve in output da qualche parte fallo fare al codice java. Il db restituisce numeri non cifre
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    Salve,
    mi ritrovo alle prese con l'ultimo di una montagna di problemi.
    In questo caso il db2 con colonna di tipo DECIMAL mi restituisce una cifra con formattazione 1234.56
    Se la colonna che tiri fuori dalla query è di tipo DECIMAL, la dovresti estrarre dal ResultSet con getBigDecimal() o al limite con getDouble(), devi sapere tu il range dei valori possibili.
    Ma così avresti solo un numero (una sua rappresentazione interna, perlomeno) che NON ha di per sé un formato. Lo dovresti "formattare" tu in stringa se vuoi una forma specifica.

    WinstonSmith ha scritto:


    questa formattazione va fatta direttamente nella query o lato java?
    Si può fare sia a livello SQL sia a livello Java. La questione è a chi/dove serve la stringa.
    Se lato Java ci devi fare qualunque tipo di calcolo, ovviamente NON può essere la query a formattare in stringa.
  • Re: Formattare cifre e date

    Ringrazio entrambi. Comunque sì, devo trasformarlo in una stringa anche perché devo poi concatenare altra roba di un altro campo (sempre tutto nella query), operazione che ho già fatto da altre parti quindi non dovrebbe essere un problema.
    Non bisogna farci nessun calcolo, va solo presa ed inviata al FE nella giusta formattazione. E pare debba farlo direttamente nella query. Quello che non sono riuscito a fare è scrivere correttamente il formato descritto sopra.
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    Non bisogna farci nessun calcolo, va solo presa ed inviata al FE nella giusta formattazione. E pare debba farlo direttamente nella query.
    Ok, allora.

    WinstonSmith ha scritto:


    WinstonSmith ha scritto:


    a me servirebbe il punto per le migliaia e la virgola per i due decimali, quindi 1.234,56
    Quello che non sono riuscito a fare è scrivere correttamente il formato descritto sopra.
    QUI c'è la documentazione ufficiale di una funzione del DB2 chiamata VARCHAR_FORMAT.
    Ci sono molti esempi (vedi al fondo, punto "Example 4") ma per quanto potrei dedurre, essendo il formato "italiano":
    VARCHAR_FORMAT(tuacolonna, '9G999D99', 'it_IT')
    P.S. fai delle query "al volo" di prova con qualunque strumento di gestione del DB2 che hai, PRIMA di mettere l'espressione nella applicazione.
    Tipo: prova anche con valori più grandi es. 1234567890.12
  • Re: Formattare cifre e date

    andbin ha scritto:



    QUI c'è la documentazione ufficiale di una funzione del DB2 chiamata VARCHAR_FORMAT.
    Ci sono molti esempi (vedi al fondo, punto "Example 4") ma per quanto potrei dedurre, essendo il formato "italiano":
    VARCHAR_FORMAT(tuacolonna, '9G999D99', 'it_IT')
    Sì, ero passato per IBM e provato a fare un tentativo usanto il formato 'de_DE' ma mi è scoppiata la query e non ho più potuto verificare perché disconnesso. Nella query originale ho questo:
    VALUE(CASE WHEN X_TIPO='1' THEN Y_CIFRA ELSE Y_CIFRA*-1 END,0) cifra
    Ho aggiunto subito dopo:
    VARCHAR_FORMAT(cifra, '9G999D99', 'de_DE') as cifraFormattata
    Sbaglio dove?
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    VALUE(CASE WHEN X_TIPO='1' THEN Y_CIFRA ELSE Y_CIFRA*-1 END,0) cifra
    Ho aggiunto subito dopo:
    VARCHAR_FORMAT(cifra, '9G999D99', 'de_DE') as cifraFormattata
    Sbaglio dove?
    Se quel cifra NON ti serve anche in uscita dalla query, tutto quel VALUE( .... ) lo puoi mettere direttamente nel VARCHAR_FORMAT.

    Anche perché non sai forse una cosa: quando usi un alias (quel "cifra") per tirar fuori un dato dalla query, quel alias serve solo per la "proiezione" finale del dato e NON lo puoi usare in un'altra colonna in uscita.
  • Re: Formattare cifre e date

    andbin ha scritto:


    WinstonSmith ha scritto:


    VALUE(CASE WHEN X_TIPO='1' THEN Y_CIFRA ELSE Y_CIFRA*-1 END,0) cifra
    Ho aggiunto subito dopo:
    VARCHAR_FORMAT(cifra, '9G999D99', 'de_DE') as cifraFormattata
    Sbaglio dove?
    Se quel cifra NON ti serve anche in uscita dalla query, tutto quel VALUE( .... ) lo puoi mettere direttamente nel VARCHAR_FORMAT.

    Anche perché non sai forse una cosa: quando usi un alias (quel "cifra") per tirar fuori un dato dalla query, quel alias serve solo per la "proiezione" finale del dato e NON lo puoi usare in un'altra colonna in uscita.
    No non mi serve, però non l'ho scritto io per questo ho fatto in questo modo, non sapevo di non poterlo usare per una altra colonna, grazie. Quindi potrei fare:
    VARCHAR_FORMAT(VALUE(CASE WHEN X_TIPO='1' THEN Y_CIFRA ELSE Y_CIFRA*-1 END,0), '9G999D99', 'de_DE') as cifraFormattata
    così? Mi ritrovo lo stesso errore di prima "THE NUMBER OF ARGUMENTS SPECIFIED FOR VARCHAR_FORMAT IS INVALID".
    Io di sql ne so poco, le query ero abituato a farle con i criteria di jpa, quindi ogni volta che tocco qualcosa c'è un rischio
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    Forse perché manca l'alias della colonna all'interno del varcharFormat (ex cifra)
    No, un alias non lo puoi mettere ovunque vuoi ma solo dove la sintassi SQL lo permette.

    Quell'ultima forma almeno strutturalmente mi pare corretta ma non me ne intendo del DB2. Ripeto, fai prima delle prove "a mano".
  • Re: Formattare cifre e date

    Ho approfittato del we, ma le due soluzioni proposte per la formattazione in db2 ma in entrambi i casi fallisce.
    Devo farle lato java a questo punto, mi hanno girato questi due metodi di utility, ma non avendo mai fatto nulla del genere, come si procede, dove si chiamano questi due metodi? Vi sembrano corretti considerando che devo passare una data presa dal db ed una cifra sempre presa dal db? grazie
    	
    	public static final String DATE_FORMAT = "dd.MM.yyyy";
    	public static final String IT_FORMAT = "#,##0.00";
    	
    	public static SimpleDateFormat getDateFomatter() {
    		SimpleDateFormat sdf= new SimpleDateFormat(DATE_FORMAT);
    		return sdf;
    	}
    	
    	public static DecimalFormat getCurrencyFormatter() {
    		DecimalFormat df = new DecimalFormat(IT_FORMAT);
    		return df;
    	}
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    Ho approfittato del we, ma le due soluzioni proposte per la formattazione in db2 ma in entrambi i casi fallisce.
    Fallisce come/perché? Ma hai verificato prima con delle prove "a mano" con delle semplici query (anche senza coinvolgere quella tabella)?

    WinstonSmith ha scritto:


    Devo farle lato java a questo punto, mi hanno girato questi due metodi di utility, ma non avendo mai fatto nulla del genere, come si procede, dove si chiamano questi due metodi? Vi sembrano corretti considerando che devo passare una data presa dal db ed una cifra sempre presa dal db?
    Per la data sì va bene. Per il valore numerico, tieni presente che "#,##0.00" NON vuol dire per forza "italiano". Quella è la specifica generalizzata ma l'output effettivo dipende dal Locale predefinito. Se è l'Italiano, allora ottieni "1.234,56" ma se fosse inglese sarebbe "1,234.56".

    Se sei sicuro che la macchina su cui girerà ha sempre la localizzazione "italiana", allora ok, altrimenti puoi anche esplicitare il Locale:

    DecimalFormat df = new DecimalFormat(IT_FORMAT, new DecimalFormatSymbols(Locale.ITALIAN));
  • Re: Formattare cifre e date

    andbin ha scritto:



    Fallisce come/perché? Ma hai verificato prima con delle prove "a mano" con delle semplici query (anche senza coinvolgere quella tabella)?
    Sì, ho fatto delle prove creando un db con singola tabella e lì formatta, ma sul campo della tab su cui sto lavorando non riconosce il comando, e per questo mi hanno girato questi due metodi da applicare (evidentemente ci erano passati anche loro).

    Però non ho capito quando/come utilizzarli... nel senso, dove li richiamo per andare a formattare?

    andbin ha scritto:


    Se sei sicuro che la macchina su cui girerà ha sempre la localizzazione "italiana", allora ok
    Non proprio, me lo hanno detto chiaramente i responsabili.
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    ma sul campo della tab su cui sto lavorando non riconosce il comando
    Purtroppo su DB2 non saprei aiutarti più di tanto (mai usato). Potrei presumere che ci sia qualche inghippo in quella espressione che avevi messo come primo argomento del VARCHAR_FORMAT ....

    WinstonSmith ha scritto:


    Però non ho capito quando/come utilizzarli... nel senso, dove li richiamo per andare a formattare?
    Quei metodi innanzitutto sono static, di "utilità" e li potresti mettere in una classe apposita es. FormatUtilities o come vuoi.

    Poi la data da db la prendi con getDate() del ResultSet mentre il valore numerico lo puoi prendere con getBigDecimal() o al limite con getDouble().

    Se in un certo punto devi fare una singola formattazione "al volo", fai es.

    String dataStr = FormatUtilities.getDateFomatter().format(rs.getDate(" ..... "));

    Se invece, per dire, hai un ciclo dove fai N formattazioni, meglio tenere fuori dal ciclo il SimpleDateFormat in modo da non ricrearlo ogni volta (si tratta solo di "buon senso" ).
    Nota: i SimpleDateFormat e DecimalFormat NON sono "thread safe", quindi non devi tenerli in una variabile tale che sia condivisa ed usata da più thread.
  • Re: Formattare cifre e date

    andbin ha scritto:



    Quei metodi innanzitutto sono static, di "utilità" e li potresti mettere in una classe apposita es. FormatUtilities o come vuoi.

    Poi la data da db la prendi con getDate() del ResultSet mentre il valore numerico lo puoi prendere con getBigDecimal() o al limite con getDouble().

    Se in un certo punto devi fare una singola formattazione "al volo", fai es.

    String dataStr = FormatUtilities.getDateFomatter().format(rs.getDate(" ..... "));

    Se invece, per dire, hai un ciclo dove fai N formattazioni, meglio tenere fuori dal ciclo il SimpleDateFormat in modo da non ricrearlo ogni volta (si tratta solo di "buon senso" ).
    Nota: i SimpleDateFormat e DecimalFormat NON sono "thread safe", quindi non devi tenerli in una variabile tale che sia condivisa ed usata da più thread.
    Sì sì, ho la mia classe con alcuni metodi di utility, tra cui questi due.
    Il problema ce l'ho perché la mappatura tra il mio bean ed il resultSet avviene direttamente nella query, del tipo:
    Select nameColumn as nomeProprietàBean
    Quindi ero abituato a fare qualcosa del tipo nella classe del mio bean mappato con annotation jpa:
    myBean.setCifra(UtilityClass.getAmountFormatter().format(rs.getBigdecimal(numeroColonna)));
    che adesso non so dove replicare, perché qui i singoli valori del rs non li prendiamo da nessuna parte
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    Quindi ero abituato a fare qualcosa del tipo nella classe del mio bean mappato con annotation jpa:
    myBean.setCifra(UtilityClass.getAmountFormatter().format(rs.getBigdecimal(numeroColonna)));
    che adesso non so dove replicare, perché qui i singoli valori del rs non li prendiamo da nessuna parte
    In che senso "non li prendiamo da nessuna parte" ? Scusa ma state usando JPA ... o direttamente JDBC? Se state usando JDBC ci sarà pur un punto in cui si "scorre" il ResultSet e si estraggono i dati .. no?
Devi accedere o registrarti per scrivere nel forum
35 risposte