Ciao a tutti! Spesso i nostri metodi prevedono numeri che devono essere visualizzati in un formato speciale. Sembra una cosa da poco, ma come realizzeresti questo compito?
Ti invitiamo a pensarci un po’ oggi. Innanzitutto, per approfondire la formattazione dei numeri in Java, ricordiamo il metodo format della classe String : public static String format(String format, Object... args) - restituisce una stringa formattata dalla format string utilizzando gli argomenti rimanenti args . E solo un esempio:
Usiamo un formato più adatto per double :
La forma generale delle istruzioni è la seguente:
In questo caso viene preso in considerazione il numero precedente. Se il numero precedente è pari, viene eseguito l'arrotondamento:
Bene, diamo un'occhiata a come è fatto. Innanzitutto, vorremmo ricordarti che l' identificatore di formato %t viene utilizzato per le date . In secondo luogo, quando si formatta un modello, sono necessari flag di formattazione aggiuntivi per ogni identificatore di formato per le date. Ecco i possibili flag di formattazione per le date:
Questo è un elenco ridotto di possibili flag di formattazione della data: ce ne sono molti, per tutti i gusti. Un elenco completo di essi e le possibili specificazioni possono essere trovati a questo link . Diamo un'occhiata a come usarlo. Questa volta non usiamo String.format() , ma subito System.out.printf() .
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
Di conseguenza, otterremo l'output nella console:
Ciao Sasha! Come va al lavoro?
printf e metodi di formattazione
String.format() non è l'unico metodo per formattare una stringa. I suoi analoghi sono System.out.printf() e System.out.format(); . Possiamo quindi sostituire il codice precedente con:System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
O
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
L'output nella console rimarrà lo stesso. L'unica differenza è che questi metodi visualizzano immediatamente il valore nella console, a differenza di String.format() . Ma mi piace di più String.format() , poiché non abbiamo sempre bisogno di visualizzare il risultato nella console, quindi utilizzeremo ulteriormente questo metodo. Torniamo al nostro esempio. Cosa vediamo? E il fatto è che nei luoghi in cui c'erano i caratteri - %s , vengono inserite le righe - "Sasha" e "al lavoro" . Come può questo aiutarci nello sviluppo? Immagina di avere un modello di testo di grandi dimensioni, ma in alcuni punti è necessario inserire valori che possono essere diversi e venire come argomenti dall'esterno. È qui che questa formattazione torna utile. Gli specificatori di formato iniziano con un segno di percentuale, %, e terminano con un carattere che indica il tipo di argomento da formattare. E, come probabilmente capirai, %s viene utilizzato per inserire oggetti: stringhe. Ma se proviamo a inserire, ad esempio, un double nel luogo in cui è registrato l'oggetto stringa:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
funzionerà anche questo. double verrà lanciato su una stringa e otterremo:
Ciao - 55.6! Come va al lavoro?
Oltre alle stringhe e ai numeri in virgola mobile, esistono altri tipi in Java, giusto? Diamo quindi un'occhiata all'intero arsenale:
Tipo di valore da formattare | Esempio | |
---|---|---|
%S | Qualsiasi tipo di cui verrà eseguito il cast su una stringa |
Risultato:
Ciao mondo!
|
%B | Qualsiasi tipo che verrà convertito in booleano : true - se il valore non è null, false - se null |
Risultato:
Ciao falso
|
%H | Puoi passare qualsiasi oggetto, che verrà convertito in una stringa di valori esadecimali dal metodo hashCode() |
Risultato:
Ciao 106c44!
|
%C | Utilizzato per specificare un carattere Unicode ( char ) |
Risultato:
Ciao mondo!
|
%D | Viene specificato un numero intero ( int. byte, short, int, long, BigInteger ) |
Risultato:
Ho già 20 anni!
|
%F | Utilizzato per specificare un numero in virgola mobile |
Risultato:
Il numero PI è - 3.141590!
|
%e | Numeri in virgola mobile nella notazione scientifica |
Risultato:
Il numero PI è - 3.141590e+00!
|
%UN | I numeri in virgola mobile saranno rappresentati in esadecimale |
Risultato:
Il numero PI è: 0x1.921f9f01b866ep1!
|
%X | Viene passato un numero intero ( int. byte, short, int, long, BigInteger ), il risultato della formattazione sarà il carattere con il numero specificato nella tabella ASCII |
Risultato:
Ho già 19 anni!
|
%o | Un numero intero ( int. byte, short, int, long, BigInteger ) è accettato e verrà rappresentato come numero ottale |
Risultato:
Ho già 31 anni!
|
%T | Prefisso per le conversioni di data e ora. Per la formattazione sono necessari flag aggiuntivi |
Risultato:
Oggi è sabato
|
%N | Separatore di linea specifico per la piattaforma. Analogico\n |
Risultato:
Ciao Ciao
|
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
Uscita console:
La distanza da Kiev a Odessa è 475.400000. Non così poco, vero?
Come avrai capito, %f sarebbe uno specificatore più appropriato per i numeri in virgola mobile, che includono tipi di dati come double e float in Java. Con questo specificatore possiamo formattare un numero in virgola mobile:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
Inserendo .2 in questo specificatore verrà troncato il numero di cifre decimali a due, dandoci l'output:
La distanza da Kiev a Odessa è 475,40. Non così poco, vero?
.2 non è l'unica modifica agli specificatori. La combinazione di queste sottoimpostazioni è chiamata istruzione . ![Formatta l'output dei numeri in Java - 2](https://cdn.javarush.com/images/article/088335ae-e68c-4e96-8b84-5a6bee89288f/512.jpeg)
%[argument_index][flags][larghezza][.precision]identificatore di tipo
Ora decifichiamo tutto in ordine:
- [argument_index] è un numero intero che indica la posizione nell'elenco degli argomenti. Ad esempio, il collegamento al primo argomento è $1, il collegamento al secondo argomento è $2, ecc. Se la posizione non è stata specificata, gli argomenti devono essere nello stesso ordine a cui viene fatto riferimento nella stringa di formato.
- [flag] sono caratteri speciali per la formattazione. Per esempio:
- + flag che indica che se un valore numerico è positivo, deve includere un segno +
- - significa allineare il risultato a sinistra
- , imposta il separatore delle migliaia per i numeri interi
- [larghezza] è un numero intero decimale positivo che specifica il numero minimo di caratteri che verranno emessi. Se questo numero è preceduto da 0, i caratteri mancanti verranno riempiti con 0, se non c'è 0, allora con spazi.
- [.accuracy] è un numero intero non negativo preceduto da un punto. Solitamente utilizzato per limitare il numero di caratteri. Il comportamento specifico dipende dal tipo specifico di specificatore.
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
E di conseguenza, l'output nella console:
+03.14159
Sembra facile, vero? Ma quando si tratta di formattare un numero, non puoi ignorare DecimalFormat . Scopriamo cosa significa.
DecimalFormat
DecimalFormat è una classe per formattare qualsiasi numero in Java, sia esso un numero intero o un numero in virgola mobile. Quando viene creato un oggetto DecimalFormat , è possibile specificare un modello per la formattazione dei numeri in entrata direttamente nel costruttore. Questo è come apparirebbe il nostro esempio utilizzando DecimalFormat :DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Uscita console:
72.224
La riga #.### è un modello che indica che stiamo formattando il valore passato a 3 cifre decimali. Quali altri simboli sono disponibili per i modelli? Ecco qui alcuni di loro:
- # : cifra, gli zeri iniziali vengono omessi;
- 0 — la cifra viene sempre visualizzata, anche se il numero ha meno cifre (in questo caso viene visualizzato 0);
- . — segno separatore decimale;
- , — segno di raggruppamento separatore (ad esempio, separatore delle migliaia);
- ; — separa i formati;
- - — contrassegna il prefisso di un numero negativo;
- % - moltiplica per 100 e mostra il numero come percentuale;
- ? — moltiplica per 1000 e mostra il numero in ppm;
- E - Separa mantissa ed esponente per la notazione scientifica.
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Uscita console:
74.554.542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Uscita console:
%72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Uscita console:
042.224
Non è necessario creare ogni volta un nuovo oggetto DecimalFormat per definire un nuovo modello. Sarà sufficiente utilizzare i suoi metodi applyPattern e applyLocalizedPattern :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Quando parliamo di formattare un numero in virgola mobile, siamo piuttosto interessati all'arrotondamento, non è vero? Pertanto, quando si taglia un numero con cifre decimali oltre il modello specificato, DecimalFormat arrotonda il numero per eccesso se l'ultimo numero tagliato è maggiore di 5. Cosa succede se l'ultimo numero tagliato è 5? Infatti, in questo caso, questo numero è esattamente a metà tra gli interi più vicini. ![Formatta l'output dei numeri in Java - 3](https://cdn.javarush.com/images/article/7d0d4af9-f14c-4f48-8184-086f4ed2484c/512.jpeg)
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Uscita console:
56.459
Se dispari non viene eseguito:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Uscita console:
56.459
La differenza tra la formattazione dei numeri in virgola mobile utilizzando String.format() e DecimalFormat.format() è che nel primo caso ci saranno zero finali, anche se non è presente alcuna parte frazionaria. Per esempio:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Uscita console:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Uscita console:
9
Come puoi vedere, quando si formatta il numero 9.00001273 con una precisione di quattro cifre decimali, il metodo format() della classe String restituirà il valore 9.0000 , mentre il metodo simile format() di DecimalFormat restituirà 9 .
BigDecimal e BigInteger
Poiché abbiamo toccato l'argomento dell'arrotondamento dei numeri in Java, parliamo di come utilizzare la classe BigDecimal per tali operazioni . Questa classe si concentra sul lavoro con numeri veramente GRANDI: per questo, i valori massimi double e float sono troppo piccoli. Questa classe ha molte impostazioni diverse per l'arrotondamento in virgola mobile, nonché molti metodi per le operazioni aritmetiche. Ha una classe simile, ma focalizzata sul lavoro con numeri interi GRANDI - BigInteger . Puoi leggere ulteriori informazioni su BigDecimal e BigInteger in questo articolo .Formattazione di data e ora
Sopra è stato solo menzionato che utilizzando format() della classe String è possibile formattare anche data e ora.![Formatta l'output dei numeri in Java - 4](https://cdn.javarush.com/images/article/982ae8bd-d9a0-4a69-a81d-682b381d1cb2/512.jpeg)
Bandiere | Descrizione |
---|---|
%tB | Nome completo del mese, ad esempio gennaio, febbraio, ecc. |
%TB | Nome abbreviato del mese, ad esempio Jan, Feb, ecc. |
%tA | Nome completo del giorno della settimana, ad esempio domenica, lunedì |
%ta | Nome abbreviato del giorno della settimana, ad esempio Sun, Mon, ecc. |
%tY | Anno nel formato a 4 cifre, ad esempio da 0000 a 9999 |
%tà | Anno nel formato a 2 cifre, ad esempio da 00 a 99 |
%tm | Il mese è formattato con zero all'inizio, ad esempio da 01 a 12 |
%tc | Data e ora nel formato %ta %tb %td %tT %tZ %tY, ad esempio Mon Feb 17 03:56:12 PST 2020 |
%tD | Data nel formato %tm/%td/%ty |
%td | Giorno del mese in formato a due cifre, ad esempio da 01 a 31 |
%te | Giorno del mese in formato senza 0 iniziale, ad esempio da 1 a 31 |
%tT | Ora nel formato 24 ore, ad esempio %tH:%tM:%tS |
%tH | Ora del giorno nel formato 24 ore, dalle 00 alle 23 |
%tI | Ora del giorno per un formato a 12 ore, ad esempio da 01 a 12 |
%tM | I minuti dell'ora sono formattati con uno zero iniziale, ad esempio da 00 a 59 |
%tS | Secondi in un minuto, costituiti da due cifre, ad esempio da 00 a 59 |
%tZ | Abbreviazione del fuso orario, come PST, UTC, ecc. |
Esempio 1
Inoltre, imposteremo la lingua del risultato passandola come primo argomento al metodo:Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Uscita console:
11 ottobre 2020
Senza specificare una lingua, verrà utilizzata la lingua predefinita (ad esempio, ho il russo).
Esempio 2
Mostriamo una data più completa:Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
E l'output nella console:
11 ottobre 2020 13:43:22
Passare lo stesso oggetto Date come argomento così tante volte... Non sembra molto bello, vero? Usiamo il sottoinsieme interno $ per specificare l'argomento che vogliamo usare:
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
L'output nella nostra console non cambierà. Esistono altri modi altrettanto interessanti per formattare le date. Puoi leggere informazioni su di loro e qualcosa in più su ora e data in Java in questo materiale . Per oggi è tutto, grazie per l'attenzione!![Formatta l'output dei numeri in Java - 5](https://cdn.javarush.com/images/article/f587099d-37a0-4506-a52a-ebf610399731/512.jpeg)
GO TO FULL VERSION