JavaRush /Java Blog /Random-JA /Java で数値出力をフォーマットする

Java で数値出力をフォーマットする

Random-JA グループに公開済み
こんにちは、みんな!多くの場合、メソッドには特別な形式で表示する必要がある数値が付属しています。小さなことのように思えますが、このタスクをどのように実装しますか? Java で数値出力をフォーマットする - 1今日はこれについて少し考えてみませんか。まず、Java での数値の書式設定について詳しく説明するために、 Stringクラスのformatメソッドを覚えておきましょう。 public static String format(String format, Object... args) -残りのargs引数を使用して書式文字列から書式設定された文字列を返します。そしてほんの一例です:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
その結果、コンソールに出力が表示されます。
こんにちは、サシャ!仕事の調子はどうですか?

printf メソッドと format メソッド

String.format() は、文字列をフォーマットする唯一のメソッドではありません。これに類似したものは、 System.out.printf()およびSystem.out.format()です。。したがって、前のコードを次のように置き換えることができます。
System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
または
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
コンソールの出力は変わりません。唯一の違いは、 String.format()とは異なり、これらのメソッドはコンソールに値をすぐに表示することです。しかし、私はString.format()の方が気に入っています。結果を常にコンソールに表示する必要がないため、このメソッドを今後も使用していきます。例に戻りましょう。何が見えますか?そして実際には、文字 - %sがあった場所に、 「Sasha」「at work」という行が挿入されています。これは開発にどのように役立つでしょうか? 大きなテンプレート テキストがあるが、いくつかの場所で異なる値を挿入する必要があり、外部から引数として取得する必要があると想像してください。ここでこの書式設定が役に立ちます。書式指定子はパーセント記号 % で始まり、書式設定される引数のタイプを示す文字で終わります。そして、おそらく理解していると思いますが、%s はオブジェクト (文字列) を挿入するために使用されます。しかし、たとえば、文字列オブジェクトが登録されている場所に doubleを挿入しようとすると、次のようになります。
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
これも機能します。double は文字列にキャストされ、次が得られます。
こんにちは - 55.6! 仕事の調子はどうですか?
Java には文字列と浮動小数点数以外にも型がありますよね。それでは、武器庫全体を見てみましょう。
フォーマットする値のタイプ
%s 文字列にキャストされる任意の型
String.format("Hi %s!","world")
結果:
「こんにちは世界」
%b booleanにキャストされる任意の型: true - 値が null でない場合、false - null の場合
String.format("Hi %b!",null)
結果:
こんにちは偽
%h hashCode()メソッドから 16 進数値文字列にキャストされる任意のオブジェクトを渡すことができます。
String.format("Hi %h!","world")
結果:
106c44さん、こんにちは!
%c Unicode 文字 ( char )を指定するために使用されます。
String.format("Hello m%cr!",'And')
結果:
「こんにちは世界」
%d 整数を指定します ( int. byte、short、int、long、BigInteger )。
String.format("I'm already %d!",20)
結果:
もう20歳だよ!
%f 浮動小数点数を指定するために使用されます
String.format("PI is - %f!", 3.14159)
結果:
PI 番号は - 3.141590 です。
%e 科学的表記法の浮動小数点数
String.format("PI is - %e!", 3.14159);
結果:
PI 番号は - 3.141590e+00 です。
%a 浮動小数点数は 16 進数で表現されます
String.format("PI is - %a!", 3.14159)
結果:
PI 番号は - 0x1.921f9f01b866ep1 です。
%バツ 整数が渡されます ( int. byte、short、int、long、BigInteger )。書式設定の結果は、ASCII テーブル内の指定された番号を持つ文字になります。
String.format("I'm already %x!",25)
結果:
もう19歳だよ!
%o 整数 ( int. byte、short、int、long、BigInteger ) が受け入れられ、8 進数として表されます。
String.format("I already %o!",25);
結果:
もう31歳だよ!
%t 日付と時刻の変換のプレフィックス。フォーマットには追加のフラグが必要です
String.format("Today is %tA",new Date())
結果:
今日は土曜日です
%n プラットフォーム固有の行区切り文字。アナログ\n
String.format("Hello %n Hello")
結果:
ハイハイ
doubleに対してより適切な形式 を使用しましょう。
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
コンソール出力:
キエフからオデッサまでの距離は475.400000です。そんなに少なくないですよね?
お気づきかと思いますが、浮動小数点数には%fの方が適切な指定子です。浮動小数点数には、Java のdoublefloatなどのデータ型が含まれます。この指定子を使用すると、浮動小数点数をフォーマットできます。
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
この指定子に.2 を挿入すると、小数点以下の桁数が 2 桁に切り捨てられ、次の出力が得られます。
キエフからオデッサまでの距離は475.40です。そんなに少なくないですよね?
.2は指定子の唯一の調整ではありません。これらのサブ設定の組み合わせを命令と呼びます。命令のJava で数値の出力をフォーマットする - 2一般的な形式は次のとおりです。
%[argument_index][flags][width][.precision]型指定子
それでは、すべてを順番に解読しましょう。
  • [argument_index]は、引数リスト内の位置を示す整数です。たとえば、最初の引数へのリンクは $1、2 番目の引数へのリンクは $2 などです。位置が指定されていない場合、引数はフォーマット文字列で参照されるのと同じ順序である必要があります。
  • [flags]は書式設定用の特殊文字です。例えば:
    • +数値が正の場合、+ 記号を含める必要があることを示すフラグ
    • -結果を左に揃えることを意味します
    • 整数の千の区切り文字を設定します
  • [width]は、出力される最小文字数を指定する正の 10 進整数です。この数値の前に 0 が付いている場合、欠落している文字は 0 で埋められ、0 がない場合はスペースで埋められます。
  • [.accuracy] は、ドットが前に付く非負の整数です。通常、文字数を制限するために使用されます。特定の動作は、特定のタイプの指定子によって異なります。
また、手順の上記の要素はすべてオプションであり、それらがなくてもすべて機能することにも注意してください。サブセットの使用例として、数値 Pi の特定の出力が必要であると想像してみましょう。
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
それに応じて、コンソールの出力は次のようになります。
+03.14159
簡単そうに思えますよね?しかし、数値の書式設定に関しては、DecimalFormatを無視することはできません。これが何を意味するのか見てみましょう。

10 進形式

DecimalFormat は、整数でも浮動小数点数でも、Java で任意の数値をフォーマットするためのクラスです。DecimalFormatオブジェクトが作成されると、受信する数値をフォーマットするためのテンプレートをコンストラクターで直接指定できます。DecimalFormat を使用した例は次のようになります。
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
コンソール出力:
72,224
#.### 行は、渡された値を小数点以下 3 桁にフォーマットすることを示すパターンです。他にパターンに使用できる記号は何ですか? その一部を次に示します。
  • # — 数字。先頭のゼロは省略されます。
  • 0 — 数値の桁数が少ない場合でも、その桁は常に表示されます (この場合は 0 が表示されます)。
  • — 小数点記号。
  • , — 区切り記号グループ化記号 (千の区切りなど)。
  • ; — 形式を分離します。
  • - — 負の数の接頭辞をマークします。
  • % - 100 を乗算し、数値をパーセンテージで表示します。
  • ? — 1000 を掛けて数値を ppm で表示します。
  • E - 科学表記の仮数と指数を区切ります。
いくつかの例を見てみましょう。
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
コンソール出力:
74,554,542.22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
コンソール出力:
%72.35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
コンソール出力:
042.224
新しいテンプレートを定義するために、毎回新しいDecimalFormatオブジェクトを作成する必要はありません。applyPatternメソッドとapplyLocalizedPatternメソッドを使用するだけで十分です。
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
浮動小数点数のフォーマットについて話すとき、私たちは丸めに非常に興味を持ちますよね。したがって、指定されたパターンを超えて小数点以下の桁数で数値をトリミングする場合、DecimalFormat は、最後にトリミングされた数値が 5 より大きい場合に数値を切り上げます。最後にトリミングされた数値が 5 の場合はどうなるでしょうか。実際、この場合、この数値は最も近い整数のちょうど中間にあります。Java で数値の出力をフォーマットする - 3この場合、前の数値が考慮されます。前の数値が偶数の場合、四捨五入が行われます。
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
コンソール出力:
56,459
奇数の場合は実行されません。
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
コンソール出力:
56,459
String.format()を使用した浮動小数点数のフォーマットとDecimalFormat.format() の違いは、前者の場合、小数部分がない場合でも末尾にゼロが存在することです。例えば:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
コンソール出力:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
コンソール出力:
9
ご覧のとおり、数値9.00001273を小数点以下 4 桁の精度で書式設定する場合、Stringクラスのformat()メソッドは値9.0000を出力しますが、DecimalFormatの同様のformat()メソッドは9を出力します。

BigDecimal と BigInteger

Java での数値の丸めのトピックについては触れたので、そのような操作にBigDecimalクラスを使用する方法について説明しましょう。このクラスは、非常に大きな数値を扱うことに重点を置いています。そのため、 doubleおよびfloat の最大値は小さすぎます。このクラスには、浮動小数点の丸めに関するさまざまな設定と、算術演算のための多くのメソッドがあります。これには同様のクラスがありますが、大きな整数の操作に焦点を当てたBigIntegerです。BigDecimalBigIntegerの詳細については、この記事を参照してください。

日付と時刻の書式設定

Stringクラスのformat()を使用すると、時刻と日付をフォーマットすることもできることは上でのみ説明しました。さて、それがどのように行われるかを見てみましょう。まず、 %t形式指定子が date に使用されることを思い出してください。次に、テンプレートを書式設定する場合、日付の書式指定子ごとに追加の書式設定フラグが必要です。日付に使用できるフォーマット フラグは次のとおりです。Java で数値の出力をフォーマットする - 4
フラグ 説明
%tB 月の完全な名前 (例: 1 月、2 月など)。
%tb 月の短縮名 (例: Jan、Feb など)。
%tA 曜日の完全な名前 (日曜日、月曜日など)
%ta 曜日の短縮名 (Sun、Mon など)。
%tY 4 桁形式の年 (例: 0000 ~ 9999)
%ty 2 桁形式の年 (たとえば、00 から 99)
%tm 月は先頭がゼロでフォーマットされます (例: 01 から 12)。
%tc %ta %tb %td %tT %tZ %tY 形式の日付と時刻 (例: Mon Feb 17 03:56:12 PST 2020)
%tD %tm/%td/%ty 形式の日付
%td 2 桁形式の日付 (01 から 31 など)
%te 先頭に 0 を付けない形式での日付 (例: 1 から 31)
%tT 24 時間形式の時刻 (例: %tH:%tM:%tS)
%tH 24 時間形式の時間 (00 から 23)
%tI 12 時間形式の時間 (例: 01 から 12)
%tM 時間内の分は、先頭にゼロを付けてフォーマットされます (例: 00 ~ 59)。
%tS 1 分の秒。たとえば 00 から 59 までの 2 桁で構成されます。
%tZ PST、UTC などのタイムゾーンの略称。
これは、可能な日付書式設定フラグの短縮リストです。好みに応じて、たくさんのフラグがあります。それらの完全なリストと使用可能な指定子は、このリンクで見つけることができます。これの使い方を見てみましょう。今回はString.format()を使用せず、すぐにSystem.out.printf() を使用します。

例1

さらに、結果の言語をメソッドの最初の引数として渡して設定します。
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
コンソール出力:
2020年10月11日
言語を指定しないと、デフォルトの言語が使用されます (たとえば、ロシア語を使用しています)。

例 2

より完全な日付を表示してみましょう。
Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
そしてコンソールの出力は次のようになります。
2020年10月11日 13:43:22
同じ Date オブジェクトを引数として何度も渡すのは、あまり良くありませんね。$ Internal サブセットを使用して、使用する引数を指定しましょう。
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
コンソールの出力は変わりません。日付をフォーマットする同様に興味深い方法が他にもあります。この資料では、それらについて、および Java での時刻と日付についてもう少し詳しく読むことができます。今日はここまでです、ご清聴ありがとうございました!Java で数値の出力をフォーマットする - 5
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION