Formattare cifre e date

di il
35 risposte

35 Risposte - Pagina 2

  • Re: Formattare cifre e date

    andbin ha scritto:



    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?
    Mi sono espresso male perché non so chiarire il concetto. In pratica abbiamo una serie di classi messe a disposizione dal framework, in una di queste si richiama il setRowMapper che ha come parametro una istanza di BeanPropertyRowMapper che ha sua volta ha il bean.class da mappare:
    ooggetto.setRowMapper(new BeanPropertyRowMapper(Oggettodamappare.class));
    
    E basta
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    in una di queste si richiama il setRowMapper che ha come parametro una istanza di BeanPropertyRowMapper che ha sua volta ha il bean.class da mappare:
    ooggetto.setRowMapper(new BeanPropertyRowMapper(Oggettodamappare.class));
    
    Si tratta del org.springframework.jdbc.core.BeanPropertyRowMapper ? Comunque sì, ho capito ...

    Ma in questo scenario e a questo livello di "mappatura" fatto così, l'unica cosa sensata sarebbe mappare quei dati nell'oggetto come Date e BigDecimal/double. Né più né meno. E poi la "formattazione" la si fa altrove e/o in un secondo momento (magari su un altro oggetto più a livello di presentation). Però non conoscendo la vostra architettura ovviamente non posso dire più di tanto ...
  • Re: Formattare cifre e date

    andbin ha scritto:



    Si tratta del org.springframework.jdbc.core.BeanPropertyRowMapper ? Comunque sì, ho capito ...

    Ma in questo scenario e a questo livello di "mappatura" fatto così, l'unica cosa sensata sarebbe mappare quei dati nell'oggetto come Date e BigDecimal/double. Né più né meno. E poi la "formattazione" la si fa altrove e/o in un secondo momento (magari su un altro oggetto più a livello di presentation). Però non conoscendo la vostra architettura ovviamente non posso dire più di tanto ...
    Esattamente.

    Ok.. quindi avendo un oggetto "gemello" che viene inviato all'esterno e che viene inizializzato prendendo i valori del bean mappato, magari dico una cretinata (non posso testare al momento e probabilmente prima di questa sera, per questo inizio a chiedere ), una cosa del genere potrebbe andare?

    if(BeanMappatoInPrecedenza.getCifra() != null)
    myBeanDaInviareAlFE.setCifra(UtilityClass.getAmountFormatter().format(BeanMappatoInPrecedenza.getCifra());
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    una cosa del genere potrebbe andare?

    if(BeanMappatoInPrecedenza.getCifra() != null)
    myBeanDaInviareAlFE.setCifra(UtilityClass.getAmountFormatter().format(BeanMappatoInPrecedenza.getCifra());
    Se l'architettura prevede appunto di avere oggetti separati per i vari strati, quindi un oggetto X per il mapping da db e poi un altro oggetto Y per la parte più di "presentazione", allora sì, può sicuramente andare.
    Nella classe di mapping per il DB ci metti i tipi giusti per il mapping, es. Date, BigInteger/double. Nella classe "di sopra" per portare fuori i dati, ci metti dei String che formatti tu.

    Se non ti piace il test del null, puoi fare un altro metodo di utilità "null safe" che restituisce o la stringa formattata oppure null (o "").
  • Re: Formattare cifre e date

    andbin ha scritto:



    Se l'architettura prevede appunto di avere oggetti separati per i vari strati, quindi un oggetto X per il mapping da db e poi un altro oggetto Y per la parte più di "presentazione", allora sì, può sicuramente andare.
    Nella classe di mapping per il DB ci metti i tipi giusti per il mapping, es. Date, BigInteger/double. Nella classe "di sopra" per portare fuori i dati, ci metti dei String che formatti tu.

    Se non ti piace il test del null, puoi fare un altro metodo di utilità "null safe" che restituisce o la stringa formattata oppure null (o "").
    Perfetto, avevo già dichiarato come String sia il Date che il Double nella classe che rappresenta l'oggetto che viene inviato al FE.
    Ora però è tutto da rifare. dalla query non dovrò farmi dare la cifra ma la concatenazione della cifra più la valuta quindi verrà fuori una stringa del tipo 1,235.90 euro che dovrà diventare 1.235,90 euro ... il metodo di prima a questo punto è da buttare. Come faccio adesso a formattare in quel modo, cosa posso andare a leggere? Perché non ne ho proprio idea.
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    Ora però è tutto da rifare. dalla query non dovrò farmi dare la cifra ma la concatenazione della cifra più la valuta quindi verrà fuori una stringa del tipo 1,235.90 euro che dovrà diventare 1.235,90 euro ... il metodo di prima a questo punto è da buttare. Come faccio adesso a formattare in quel modo, cosa posso andare a leggere? Perché non ne ho proprio idea.
    La valuta è fissa o dinamica in base ai dati in tabella? Se arriva dinamico da db, il bean di mappatura della query avrà un campo double e un campo String con la valuta. Sarà poi lo strato di sopra a formattare il valore e mettergli insieme la valuta.
  • Re: Formattare cifre e date

    andbin ha scritto:



    La valuta è fissa o dinamica in base ai dati in tabella? Se arriva dinamico da db, il bean di mappatura della query avrà un campo double e un campo String con la valuta. Sarà poi lo strato di sopra a formattare il valore e mettergli insieme la valuta.
    Dinamico, ma da documentazione io non ho la proprietà valuta, quindi pensavo di dover ottenere da query la concatenazione di cifra + valuta. Ma se posso farlo in ultima cosa, tanto meglio.

    La formattazione è scritta correttamente come regola da seguire?
    public static final String IT_FORMAT = "#,##0.00";
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    quindi pensavo di dover ottenere da query la concatenazione di cifra + valuta.
    Sì ma vorrebbe dire che devi formattare la cifra a livello SQL .... e non era quello che non ti stava riuscendo?

    WinstonSmith ha scritto:


    La formattazione è scritta correttamente come regola da seguire?
    public static final String IT_FORMAT = "#,##0.00";
    Sì è corretto questo formato (lo trovi anche nel javadoc di DecimalFormat). Ribadisco solo che non vuol dire "in italiano". I simboli da usare derivano dal Locale.
  • Re: Formattare cifre e date

    andbin ha scritto:



    Sì ma vorrebbe dire che devi formattare la cifra a livello SQL .... e non era quello che non ti stava riuscendo?
    fino ad ora la concatenazione tra numeri e stringhe non mi ha mai dato problemi, solo che poi non saprei come formattarla nuovamente (punto migliaia e virgola decimali)
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    fino ad ora la concatenazione tra numeri e stringhe non mi ha mai dato problemi, solo che poi non saprei come formattarla nuovamente (punto migliaia e virgola decimali)
    Il problema di una soluzione del genere è che è più pesante e più "brutta". Perché dovresti comporre in SQL la stringa con anche la valuta, poi lato Java devi spezzarla, estrarre la sotto-stringa del valore, fare un parsing, ottenere il valore numerico, quindi riformattarlo e riconcatenare la valuta.

    Per farlo ... sì fa, non è certo impossibile. Ma ti assicuro veramente che è proprio "brutto" da fare e vedere. Se proprio volessi fare così, almeno a livello SQL metti il numero in stringa nella forma "inglese", senza il separatore delle migliaia. Qualcosa es. "123456.78 EUR". Almeno così puoi usare Double.parseDouble() senza dover tirare in ballo il DecimalFormat per il parsing (poi però il DecimalFormat serve ovviamente per la ri-formattazione).

    Altrimenti l'altra soluzione che già dicevo, si tira su da db il valore e la valuta separatamente e poi si fa la formattazione/composizione lato Java.
  • Re: Formattare cifre e date

    Certo, molto più smeplice la soluzione della concatenazione non nella query.
    Finalmento ho potuto testare il tutto, ma.. Malformed pattern "#.##0,00" però da quello che ho capito di base viene formattato con la formattazione locale, quindi credo non sia importante.
    Mentre il simbolo € me lo restituisce in u \u001a
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    ma.. Malformed pattern "#.##0,00"
    Sì, infatti è sbagliato. Va messo "#,##0.00".

    Ti ripeto che questa forma NON è italiana o inglese o che altro. E' solo la specifica generalizzata. In questo pattern "," vuol dire "metti qui il separatore delle migliaia (quello che è per il tal Locale) e "." vuol dire "metti qui il separatore dei decimali (quello che è per il tal Locale)".

    I due simboli esatti usati all'atto della formattazione dipendono dal Locale utilizzato (implicito o esplicito che sia).

    WinstonSmith ha scritto:


    Mentre il simbolo € me lo restituisce in u \u001a
    Alt. Il simbolo dell'Euro "€" è molto speciale. Il suo codice Unicode è U+20AC.
    Quindi:
    - bisogna vedere se da DB viene estratto correttamente. A livello Java devi avere una stringa con 1 char che ha valore \u20AC (8364 in decimale)
    - bisogna vedere se non viene fatta lato presentazione una trasformazione strana/sballata in un qualche charset che NON è in grado di rappresentarlo.
    - bisogna vedere dove viene visualizzato
    - e con quale font di carattere
  • Re: Formattare cifre e date

    andbin ha scritto:



    Alt. Il simbolo dell'Euro "€" è molto speciale. Il suo codice Unicode è U+20AC.
    Quindi:
    - bisogna vedere se da DB viene estratto correttamente. A livello Java devi avere una stringa con 1 char che ha valore \u20AC (8364 in decimale)
    - bisogna vedere se non viene fatta lato presentazione una trasformazione strana/sballata in un qualche charset che NON è in grado di rappresentarlo.
    - bisogna vedere dove viene visualizzato
    - e con quale font di carattere
    Da db dovrebbe arrivare una stringa "euro", però avevo chiesto di restituirmi €.
    Aggirare il tutto con un metodo di utility:
    	public static String getEuro() {
    		String valuta= "€";
    		return valuta;
    	}
    quindi:
    if(beanMappato.getValuta().equals("EURO"){ ClasseStatica.getEuro()}
    
  • Re: Formattare cifre e date

    WinstonSmith ha scritto:


    	public static String getEuro() {
    		String valuta= "€";
    		return valuta;
    	}
    Ma no ... si mette una costante!
    public static final String SIMBOLO_EURO = "€";

    WinstonSmith ha scritto:


    if(beanMappato.getValuta().equals("EURO"){ ClasseStatica.getEuro()}
    
    .. ti conviene fare un metodo apposito per la formattazione della cifra+valuta, es.:
    public static String formatValoreConValuta(double valore, String valuta, DecimalFormat df)
    All'interno formatti il valore e "transcodifichi" la valuta componendo poi tutto insieme.
  • Re: Formattare cifre e date

    andbin ha scritto:



    Ma no ... si mette una costante!

    .. ti conviene fare un metodo apposito per la formattazione della cifra+valuta, es.:
    All'interno formatti il valore e "transcodifichi" la valuta componendo poi tutto insieme.
    Quello della costante è un errore dovuto all'orario
    Prendo nota del tuo suggerimento ed eseguo, grazie.
Devi accedere o registrarti per scrivere nel forum
35 risposte