Salut tout le monde! Souvent, nos méthodes sont accompagnées de nombres qui doivent être affichés dans un format spécial. Cela semble être une petite chose, mais comment mettriez-vous en œuvre cette tâche ? Nous vous invitons à y réfléchir un peu aujourd’hui. Tout d'abord, pour plonger dans le formatage des nombres en Java, rappelons-nous la méthode format de la classe String : public static String format(String format, Object... args) - renvoie une chaîne formatée à partir de la chaîne de format en utilisant les arguments args restants . Et juste un exemple :
Utilisons un format plus approprié pour double :
Il s'agit d'une liste raccourcie d'indicateurs de formatage de date possibles - il y en a beaucoup, pour tous les goûts. Une liste complète d'entre eux et les spécificateurs possibles peuvent être trouvés sur ce lien . Voyons comment l'utiliser. Cette fois, nous n'utilisons pas String.format() , mais immédiatement System.out.printf() .
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
En conséquence, nous obtiendrons le résultat dans la console :
Bonjour Sacha ! Comment ça se passe au travail ?
méthodes printf et format
String.format() n'est pas la seule méthode pour formater une chaîne. Ses analogues sont System.out.printf() et System.out.format(); . On peut donc remplacer le code précédent par :System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
ou
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
La sortie dans la console restera la même. La seule différence est que ces méthodes affichent immédiatement la valeur dans la console, contrairement à String.format() . Mais j'aime mieux String.format() , car nous n'avons pas toujours besoin d'afficher le résultat dans la console, nous utiliserons donc cette méthode plus loin. Revenons à notre exemple. Que voit-on ? Et le fait est qu'aux endroits où il y avait des caractères - %s , les lignes - "Sasha" et "au travail" sont insérées . Comment cela peut-il nous aider dans le développement ? Imaginez que vous disposez d'un grand texte de modèle, mais à certains endroits, vous devez insérer des valeurs qui peuvent être différentes et provenir de l'extérieur sous forme d'arguments. C'est là que ce formatage est utile. Les spécificateurs de format commencent par un signe de pourcentage, %, et se terminent par un caractère indiquant le type d'argument à formater. Et, comme vous l'avez probablement compris, %s est utilisé pour insérer des objets - des chaînes. Mais si nous essayons d'insérer, par exemple, un double à l'endroit où l'objet chaîne est enregistré :
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
cela fonctionnera également. double sera converti en chaîne et nous obtiendrons :
Bonjour - 55,6 ! Comment ça se passe au travail ?
Outre les chaînes et les nombres à virgule flottante, il existe d’autres types en Java, n’est-ce pas ? Jetons donc un coup d'œil à l'ensemble de l'arsenal :
Type de valeur à formater | Exemple | |
---|---|---|
%s | Tout type qui sera converti en chaîne |
Résultat:
Bonjour le monde!
|
%b | Tout type qui sera converti en booléen : true - si la valeur n'est pas nulle, false - si nulle |
Résultat:
Bonjour faux
|
%h | Vous pouvez transmettre n'importe quel objet, qui sera converti en chaîne de valeur hexadécimale à partir de la méthode hashCode() |
Résultat:
Bonjour 106c44 !
|
%c | Utilisé pour spécifier un caractère Unicode ( char ) |
Résultat:
Bonjour le monde!
|
%d | Un entier est spécifié ( int. byte, short, int, long, BigInteger ) |
Résultat:
J'ai déjà 20 ans !
|
%F | Utilisé pour spécifier un nombre à virgule flottante |
Résultat:
Le numéro PI est - 3.141590 !
|
%e | Nombres à virgule flottante en notation scientifique |
Résultat:
Le numéro PI est - 3.141590e+00 !
|
%un | Les nombres à virgule flottante seront représentés en hexadécimal |
Résultat:
Le numéro PI est - 0x1.921f9f01b866ep1 !
|
%X | Un entier est passé ( int. byte, short, int, long, BigInteger ), le résultat du formatage sera le caractère avec le numéro donné dans la table ASCII |
Résultat:
J'ai déjà 19 ans !
|
%o | Un entier ( int. byte, short, int, long, BigInteger ) est accepté et sera représenté sous forme de nombre octal |
Résultat:
J'ai déjà 31 ans !
|
%t | Préfixe pour les conversions de date et d'heure. Des indicateurs supplémentaires sont requis pour le formatage |
Résultat:
Nous sommes samedi aujourd'hui
|
%n | Séparateur de lignes spécifique à la plate-forme. Analogique\n |
Résultat:
Salut Salut
|
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
Sortie de la console :
La distance entre Kiev et Odessa est de 475,400000. Pas si peu, non ?
Comme vous l'avez peut-être réalisé, %f serait un spécificateur plus approprié pour les nombres à virgule flottante, qui incluent des types de données comme double et float en Java. Avec ce spécificateur, nous pouvons formater un nombre à virgule flottante :
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
L'insertion de .2 dans ce spécificateur tronquera le nombre de décimales à deux, nous donnant le résultat :
La distance entre Kiev et Odessa est de 475,40. Pas si peu, non ?
.2 n’est pas la seule modification apportée aux spécificateurs. La combinaison de ces sous-ensembles s'appelle une instruction . La forme générale des instructions est la suivante :
%[argument_index][flags][width][.precision]spécificateur de type
Maintenant, décryptons tout dans l'ordre :
- [argument_index] est un entier indiquant la position dans la liste d'arguments. Par exemple, le lien vers le premier argument est $1, le lien vers le deuxième argument est $2, etc. Si la position n'a pas été spécifiée, les arguments doivent être dans le même ordre que celui dans lequel ils sont référencés dans la chaîne de format.
- [drapeaux] sont des caractères spéciaux pour le formatage. Par exemple:
- Drapeau + indiquant que si une valeur numérique est positive, elle doit inclure un signe +
- - signifie aligner le résultat à gauche
- , définit le séparateur de milliers pour les entiers
- [width] est un entier décimal positif qui spécifie le nombre minimum de caractères qui seront affichés. Si ce numéro est précédé de 0, alors les caractères manquants seront complétés par des 0, s'il n'y a pas de 0, alors par des espaces.
- [.accuracy] est un entier non négatif précédé d'un point. Généralement utilisé pour limiter le nombre de caractères. Le comportement spécifique dépend du type spécifique de spécificateur.
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Et en conséquence, la sortie dans la console :
+03.14159
Cela semble facile, non ? Mais lorsqu’il s’agit de formater un nombre, vous ne pouvez pas ignorer DecimalFormat . Voyons ce que cela signifie.
Format décimal
DecimalFormat est une classe permettant de formater n'importe quel nombre en Java, qu'il s'agisse d'un nombre entier ou d'un nombre à virgule flottante. Lorsqu'un objet DecimalFormat est créé , vous pouvez spécifier un modèle pour formater les nombres entrants directement dans le constructeur. Voici à quoi ressemblerait notre exemple en utilisant DecimalFormat :DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Sortie de la console :
72 224
La ligne #.### est un modèle qui indique que nous formatons la valeur transmise à 3 décimales. Quels autres symboles sont disponibles pour les motifs ? En voici quelques uns:
- # — chiffre, les zéros non significatifs sont omis ;
- 0 — le chiffre est toujours affiché, même si le numéro comporte moins de chiffres (dans ce cas, 0 est affiché) ;
- . — signe séparateur décimal ;
- , — signe de regroupement des séparateurs (par exemple, séparateur de milliers) ;
- ; — sépare les formats ;
- - — marque le préfixe d'un nombre négatif ;
- % - multiplie par 100 et affiche le nombre sous forme de pourcentage ;
- ? — multiplie par 1000 et affiche le nombre en ppm ;
- E - Sépare la mantisse et l'exposant pour la notation scientifique.
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Sortie de la console :
74 554 542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Sortie de la console :
%72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Sortie de la console :
042.224
Il n'est pas nécessaire de créer un nouvel objet DecimalFormat à chaque fois pour définir un nouveau modèle. Il suffira d'utiliser ses méthodes applyPattern et applyLocalizedPattern :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Lorsque nous parlons de formater un nombre à virgule flottante, nous sommes très intéressés par l'arrondi, n'est-ce pas ? Ainsi, lors du découpage d'un nombre avec des décimales au-delà du motif spécifié, DecimalFormat arrondit le nombre si le dernier nombre coupé est supérieur à 5. Que se passe-t-il si le dernier nombre coupé est 5 ? En effet, dans ce cas, ce nombre est exactement au milieu entre les entiers les plus proches. Dans ce cas, le numéro précédent est pris en compte. Si le nombre précédent est pair, on arrondit :
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Sortie de la console :
56 459
Si impair, il n'est pas effectué :
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Sortie de la console :
56 459
La différence entre le formatage des nombres à virgule flottante à l'aide de String.format() et DecimalFormat.format() est que dans le premier cas, il y aura des zéros à droite, même s'il n'y a pas de partie fractionnaire. Par exemple:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Sortie de la console :
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Sortie de la console :
9
Comme vous pouvez le voir, lors du formatage du nombre 9.00001273 avec une précision de quatre décimales, la méthode format() de la classe String affichera la valeur 9.0000 , tandis que la méthode format() similaire de DecimalFormat affichera 9 .
BigDecimal et BigInteger
Puisque nous avons abordé le sujet de l'arrondi des nombres en Java, parlons de la façon d'utiliser la classe BigDecimal pour de telles opérations . Cette classe se concentre sur le travail avec de très GRANDS nombres : pour cela, les valeurs maximales double et float sont trop petites. Cette classe possède de nombreux paramètres différents pour l'arrondi en virgule flottante, ainsi que de nombreuses méthodes pour les opérations arithmétiques. Il a une classe similaire, mais axée sur le travail avec de GRANDS entiers - BigInteger . Vous pouvez en savoir plus sur BigDecimal et BigInteger dans cet article .Formatage de la date et de l'heure
Il a seulement été mentionné ci-dessus qu'en utilisant format() de la classe String , vous pouvez également formater l'heure et la date. Eh bien, regardons comment cela se fait. Tout d’abord, nous souhaitons vous rappeler que le spécificateur de format %t est utilisé pour les dates . Deuxièmement, lors du formatage d'un modèle, des indicateurs de formatage supplémentaires sont requis pour chaque spécificateur de format pour les dates. Voici les indicateurs de formatage possibles pour les dates :Drapeaux | Description |
---|---|
%tB | Nom complet du mois, par exemple janvier, février, etc. |
%tb | Nom abrégé du mois, par exemple janvier, février, etc. |
%tA | Nom complet du jour de la semaine, par exemple dimanche, lundi |
%ta | Nom abrégé du jour de la semaine, par exemple Dim, Lun, etc. |
%tY | Année au format 4 chiffres, par exemple 0000 à 9999 |
%té | Année au format à 2 chiffres, par exemple de 00 à 99 |
%tm | Le mois est formaté avec zéro au début, par exemple 01 à 12 |
%tc | Date et heure au format %ta %tb %td %tT %tZ %tY, par exemple, lundi 17 février 03:56:12 PST 2020 |
%tD | Date au format %tm/%td/%ty |
%td | Jour du mois au format à deux chiffres, par exemple 01 à 31 |
%te | Jour du mois au format sans 0, par exemple de 1 à 31 |
%tT | Heure au format 24 heures, par exemple %tH:%tM:%tS |
%ème | Heure de la journée au format 24 heures, de 00 à 23 |
%tI | Heure de la journée pour un format de 12 heures, par exemple 01 à 12 |
%tM | Les minutes de l'heure sont formatées avec un zéro non significatif, par exemple 00 à 59 |
%tS | Secondes dans une minute, composées de deux chiffres, par exemple de 00 à 59 |
%tZ | Abréviation de fuseau horaire, telle que PST, UTC, etc. |
Exemple 1
De plus, nous définirons la langue du résultat en la passant comme premier argument à la méthode :Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Sortie de la console :
11 octobre 2020
Sans préciser de langue, la langue par défaut sera utilisée (par exemple, j'ai le russe).
Exemple 2
Affichons une date plus complète :Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
Et le résultat dans la console :
11 octobre 2020 13:43:22
Passer le même objet Date comme argument tant de fois... Cela n'a pas l'air très bien, n'est-ce pas ? Utilisons le sous-ensemble $ internal pour spécifier l'argument que nous voulons utiliser :
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
La sortie dans notre console ne changera pas. Il existe d’autres manières tout aussi intéressantes de formater les dates. Vous pouvez en savoir plus sur eux et un peu plus sur l'heure et la date en Java dans ce document . C'est tout pour aujourd'hui, merci de votre attention !
GO TO FULL VERSION