Formattare importo

di il
28 risposte

Formattare importo

Buongiorno, dopo averci giocato una serata ho bisogno del vostro aiuto.

codice di esempio:
if(dto.getImporto() != null)
ent.setImporto(dto.getImporto())
Problema:
l'importo non è nel formato italiano ed il programma non gira in locale, come passo da 1,234.56 a 1.234,56 ?
Da notare che il parametro importo della mia ent è una stringa mentre del mio dto è un Double.

Ne ho provate diverse ma funziona solo in locale, come ho fatto io. Ci vuole un metodo di utility? (fatto ma evidentemente male), come strutturo?
Grazie mille, sono nei guai!

28 Risposte

  • Re: Formattare importo

    Test90 ha scritto:


    if(dto.getImporto() != null)
    ent.setImporto(dto.getImporto())
    Da notare che il parametro importo della mia ent è una stringa mentre del mio dto è un Double.
    Se dto.getImporto() dà un Double e ent.setImporto() si aspetta in argomento un String, è OVVIO che non ti compila nemmeno!
    Il numero Double va "formattato". Quale formato (inglese, italiano ecc..) lo devi sapere tu. Cosa usare: String.format() oppure i NumberFormat/DecimalFormat.
  • Re: Formattare importo

    andbin ha scritto:


    Test90 ha scritto:


    if(dto.getImporto() != null)
    ent.setImporto(dto.getImporto())
    Da notare che il parametro importo della mia ent è una stringa mentre del mio dto è un Double.
    Se dto.getImporto() dà un Double e ent.setImporto() si aspetta in argomento un String, è OVVIO che non ti compila nemmeno!
    Il numero Double va "formattato". Quale formato (inglese, italiano ecc..) lo devi sapere tu. Cosa usare: String.format() oppure i NumberFormat/DecimalFormat.
    Sono un idiota, per far di fretta ho scritto male, questo è:
    if(dto.getImporto() != null)
    ent.setImporto(dto.getImporto()(Utility.getFormatter().format(dto.getImporto()));
    dove getFormatter è
    public static NumberFormat getFormatter() {
    	Locale locale = new Locale( "it" , "IT" );      
    	NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
    	return currencyFormatter;
    	} 
    in locale và, non posso però provare in ambiente cliente. Dovrebbe andar bene così?
  • Re: Formattare importo

    Test90 ha scritto:


    ent.setImporto(dto.getImporto()(Utility.getFormatter().format(dto.getImporto()));
    Forse intendevi:
    ent.setImporto(Utility.getFormatter().format(dto.getImporto()));

    Test90 ha scritto:


    public static NumberFormat getFormatter() {
    	Locale locale = new Locale( "it" , "IT" );      
    	NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
    	return currencyFormatter;
    	} 
    Dovrebbe andar bene così?
    Corretto ma come ottimizzazione, dato il locale "fisso":

    NumberFormat.getCurrencyInstance(Locale.ITALY)
  • Re: Formattare importo

    andbin ha scritto:


    Test90 ha scritto:


    ent.setImporto(dto.getImporto()(Utility.getFormatter().format(dto.getImporto()));
    Forse intendevi:
    ent.setImporto(Utility.getFormatter().format(dto.getImporto()));

    Test90 ha scritto:


    public static NumberFormat getFormatter() {
    	Locale locale = new Locale( "it" , "IT" );      
    	NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
    	return currencyFormatter;
    	} 
    Dovrebbe andar bene così?
    Corretto ma come ottimizzazione, dato il locale "fisso":

    NumberFormat.getCurrencyInstance(Locale.ITALY)
    Mi aggiunge il simbolo euro che non so da dove prenda visto che non c'è traccia nel mio codice. Ora aggiungo il locale.italy come detto da te e vede se era per questo
  • Re: Formattare importo

    Test90 ha scritto:


    Mi aggiunge il simbolo euro che non so da dove prenda visto che non c'è traccia nel mio codice.
    NumberFormat.getCurrencyInstance(locale)

    E' il getCurrencyInstance che fa così. Scusa ma sai che cosa stai usando ... o no? Se non ti va, usa un'altra factory di NumberFormat !
  • Re: Formattare importo

    Sì, per la fretta non c'ho neppure pensato, alla fine ho risolto in questo modo anche se probabilmente non è la soluzione migliore:
      public static DecimalFormat getFormatter() {
    	        DecimalFormat d f= new DecimalFormat();
    	        df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ITALIAN));
    	        df.applyLocalizedPattern("###0,00");
    	        return df;
    	    }
    Ora però ho u altro problema con la formattazione dell'importo (non legato a questo).
    Mi arriva un 100 ed a me serve che diventi un 100,00 ma come invio al fe un 100,00 senza falro diventare stringa? Loro lo vogliono come double... tutte le soluzione che sono riuscito ad applicare passano per la formattazione in String
  • Re: Formattare importo

    Test90 ha scritto:


    Sì, per la fretta non c'ho neppure pensato, alla fine ho risolto in questo modo anche se probabilmente non è la soluzione migliore:
      public static DecimalFormat getFormatter() {
    	        DecimalFormat d f= new DecimalFormat();
    	        df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ITALIAN));
    	        df.applyLocalizedPattern("###0,00");
    	        return df;
    	    }
    Si poteva fare ...
        public static NumberFormat getFormatter() {
            NumberFormat nf = NumberFormat.getInstance(Locale.ITALIAN);
            nf.setMaximumFractionDigits(2);
            return nf;
        }
    E nota che Locale.ITALIAN e Locale.ITALY sono due locale leggermente differenti.

    Test90 ha scritto:


    Mi arriva un 100 ed a me serve che diventi un 100,00 ma come invio al fe un 100,00 senza falro diventare stringa? Loro lo vogliono come double...
    Se vogliono un double nel senso ad esempio dei numeri esprimibili in JSON, allora se lo deve formattare il FE .... e basta.
  • Re: Formattare importo

    andbin ha scritto:



    Si poteva fare ...
        public static NumberFormat getFormatter() {
            NumberFormat nf = NumberFormat.getInstance(Locale.ITALIAN);
            nf.setMaximumFractionDigits(2);
            return nf;
        }
    E nota che Locale.ITALIAN e Locale.ITALY sono due locale leggermente differenti.

    Se vogliono un double nel senso ad esempio dei numeri esprimibili in JSON, allora se lo deve formattare il FE .... e basta.
    E sarebbe stato più semplice
    Non ne vogliono sapere, devo fare io ma se provo a formattare 10 in 10,00 non devo per forza far uscire una stringa? o un qualcosa o altra classe numerica che ne permette la formattazione?
  • Re: Formattare importo

    Test90 ha scritto:


    se provo a formattare 10 in 10,00 non devo per forza far uscire una stringa?
    E sì certo, una stringa ovviamente ..

    E lo ripeto: di che si tratta? Dati forniti in JSON?? Allora se non è un numero secondo JSON .... dovrà essere una stringa.
  • Re: Formattare importo

    andbin ha scritto:


    Test90 ha scritto:


    se provo a formattare 10 in 10,00 non devo per forza far uscire una stringa?
    E sì certo, una stringa ovviamente ..

    E lo ripeto: di che si tratta? Dati forniti in JSON?? Allora se non è un numero secondo JSON .... dovrà essere una stringa.
    Sì, dati che viaggiano in formato json.
    Fino ad 1h fa ero convinto bisognasse per forza mandarlo come stringa vista la formattazione d'applicare, ma loro insistono... "basta che arrotondi"
  • Re: Formattare importo

    Test90 ha scritto:


    ma loro insistono... "basta che arrotondi"
    Non vedo il problema, allora .... lo mandi come numero JSON. Chiaramente lo arrotondi prima tu.
  • Re: Formattare importo

    andbin ha scritto:



    Non vedo il problema, allora .... lo mandi come numero JSON. Chiaramente lo arrotondi prima tu.
    Ed allora si torna al quesito iniziale, come arrotondo 10 a 10,00 o per dire 10,5 a 10,50 ? mantenendolo come numerico e non come stringa?
  • Re: Formattare importo

    Test90 ha scritto:


    come arrotondo 10 a 10,00 o per dire 10,5 a 10,50 ?
    Questo che tu stai continuando a dire NON è un arrotondamento ... è una FORMATTAZIONE.

    Se tu mandi al FE un numero puro (non string) come 10.5, sarà poi compito del FE formattarlo per inserire eventualmente (SE lo vogliono) gli zeri non significativi, cioè "10,5" oppure "10,50".

    Quello che tu lato Java puoi fare è una logica di arrotondamento con un piccolo metodo (se vuoi si può generalizzare a n cifre) da fare appositamente, perché nel framework standard non c'è una logica di solo arrotondamento a N cifre decimali già fatta.

    Dato es. 10.5678

    1) Moltiplichi per 100, ottieni 1056.78

    2) Arrotondi con Math.floor() / round() / ceil() a seconda del tipo di arrotondamento
    Math.round(1056.78) dà 1057

    3) Dividi per 100, ottieni 10.57

    Questo è un arrotondamento.
  • Re: Formattare importo

    andbin ha scritto:



    Questo che tu stai continuando a dire NON è un arrotondamento ... è una FORMATTAZIONE.

    Se tu mandi al FE un numero puro (non string) come 10.5, sarà poi compito del FE formattarlo per inserire eventualmente (SE lo vogliono) gli zeri non significativi, cioè "10,5" oppure "10,50".

    Quello che tu lato Java puoi fare è una logica di arrotondamento con un piccolo metodo (se vuoi si può generalizzare a n cifre) da fare appositamente, perché nel framework standard non c'è una logica di solo arrotondamento a N cifre decimali già fatta.

    Dato es. 10.5678

    1) Moltiplichi per 100, ottieni 1056.78

    2) Arrotondi con Math.floor() / round() / ceil() a seconda del tipo di arrotondamento
    Math.round(1056.78) dà 1057

    3) Dividi per 100, ottieni 10.57

    Questo è un arrotondamento.
    Discussione:
    fe : ci serve dato numerico con ", a separare intero dai 2 decimali
    io: ok, ma se formatto mettendo virgole ed i due decimali nel caso dovessero mancare poi vi mando una stringa
    fe: no, basta che arrotondi

    Quindi da qui il dubbio virgola mandando un numero e 00 o 0 dove manca
Devi accedere o registrarti per scrivere nel forum
28 risposte