Come posso formattare un numero di stringa per avere virgole e arrotondamenti?


142

Qual è il modo migliore per formattare il seguente numero che mi viene dato come stringa?

String number = "1000500000.574" //assume my value will always be a String

Voglio che questa sia una stringa con il valore: 1,000,500,000.57

Come posso formattarlo come tale?

Risposte:


256

Potresti voler dare un'occhiata alla DecimalFormatclasse; supporta diverse impostazioni locali (ad esempio: in alcuni paesi verrebbero formattati come 1.000.500.000,57invece).

Devi anche convertire quella stringa in un numero, questo può essere fatto con:

double amount = Double.parseDouble(number);

Esempio di codice:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

puoi mostrare un esempio di come posso usare NumberFormat in questo caso particolare?
Sheehan Alam,

1
puoi anche usare la soluzione seguente: stringa statica pubblica getRoundOffValue (doppio valore) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); return df.format (valore); }
Jitendra Nath

Preferisco anche lo zero prima del punto come DecimalFormat formatter = new DecimalFormat ("#, ## 0.00"); - ottenere 0,00 per zero suona male per me
Leo

45

Questo può essere ottenuto anche usando String.format (), che può essere più semplice e / o più flessibile se si formattano più numeri in una stringa.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Per la stringa di formato "% ,. 2f" - "," indica gruppi di cifre separati da virgole e ".2" significa arrotondare a due posizioni dopo il decimale.

Per riferimento su altre opzioni di formattazione, consultare https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

Dopo aver convertito la stringa in un numero, è possibile utilizzare

// format the number for the default locale
NumberFormat.getInstance().format(num)

o

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

Come specificare sia la locale che arrotondare a (diciamo) 2 decimali?
Jonik,

6
Ah, non importa, l'ho trovato:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik,

16

Dato che questo è il risultato numero uno di Google format number commas java, ecco una risposta che funziona per le persone che lavorano con numeri interi e non si preoccupano dei decimali.

String.format("%,d", 2000000)

uscite:

2,000,000

funziona anche con float, ad es. printf ("%, f \ n", decimalNumber)
philwalk

12

Ho creato la mia utility di formattazione. Che è estremamente veloce nell'elaborare la formattazione insieme a darti molte funzionalità :)

Supporta:

  • Formattazione della virgola Ad esempio 1234567 diventa 1.234.567.
  • Prefisso "Mille (K), Milioni (M), Miliardi (B), Trilioni (T)".
  • Precisione da 0 a 15.
  • Ridimensionamento di precisione (indica se si desidera una precisione di 6 cifre, ma si dispone solo di 3 cifre disponibili che la forza a 3).
  • Abbassamento prefisso (significa che se il prefisso scelto è troppo grande, lo abbassa a un prefisso più adatto).

Il codice può essere trovato qui . Lo chiami così:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Dovrei anche sottolineare che questo non gestisce il supporto decimale, ma è molto utile per i valori interi. L'esempio sopra mostrerebbe "1.23M" come output. Probabilmente potrei aggiungere il supporto decimale forse, ma da allora non ho visto troppi utilizzi per unirlo in un tipo di classe BigInteger che gestisce array di caratteri compressi [] per i calcoli matematici.


2
Questo è utile se lavori solo in inglese. Il mio suggerimento è quello di evitare una cosa che fa incazzare la cena dei miei utenti non inglesi in quanto non sono in grado di capire cosa Ko cosa Msignifichi
rishabhmhjn

@rishabhmhjn ma ... non puoi semplicemente modificarlo per modificarlo in qualsiasi lettera ti serva? la tua sfortuna è colpa sua? : oe quello che ha creato è abbastanza bello, nonostante il link non sia disponibile in questo momento ..
Aquarius Power,

@AquariusPower il problema è, ad esempio, i numeri giapponesi non seguono il sistema metrico. I loro numeri sono come 1 百 per 100, 1 千 per 1000, 1 万 per 10000, quindi diventa 1 千万 per 1000,0000. Il mio team stava lavorando su qualcosa di simile in Javascript. Puoi usare la logica menzionata in questo: github.com/statusbrew/angular-bignumber
rishabhmhjn,

Ho trovato il mio vecchio codice per questo, quindi l'ho ricaricato su GitHub. Il link nei commenti è stato aggiornato.
Jeremy Trifilo,

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

puoi anche usare la soluzione seguente -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

Puoi eseguire l'intera conversione in una riga, utilizzando il seguente codice:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Gli ultimi due segni # nel costruttore DecimalFormat possono anche essere 0s. In entrambi i casi funziona.


3

La prima risposta funziona molto bene, ma per ZERO / 0 verrà formattata come .00

Quindi il formato #, ## 0.00 funziona bene per me. Testare sempre numeri diversi come 0/100 / 2334.30 e numeri negativi prima di implementarli nel sistema di produzione.


3

Ecco il modo più semplice per arrivarci:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

uscita: 10.987.655,88

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.