Java Formaterの心得

4811 ワード

言葉を述べる
java utilパッケージのソースコードを読んでいると、突然発見しました。フォーマット類の使用を見終わった後、コードを書くのはあまりにも考えられませんでした。copyは来たら使いに来ます。
簡単な例
question 1
現在の日付と時刻の書式を出力したいです。文字列2013-04-28:20:12
普通はこうするかもしれません。SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar cal = Calendar.getInstance();System.out.println(dateFormater.format(cal.getTime()));しかし、C言語プログラマであれば、フォーマット文字という仕組みが分かります。javaはこの点をよく継承しています。そして、このメカニズムを強化しました。通常のタイプだけでなく、日付タイプもサポートしています。System.out.println(String.format("%1$tF %1$tT", Calendar.getInstance()));このコードはあまり動かないかもしれません。正則のように複雑で友好的ではない文字が、私達の目に見えなくなりました。しかし、正則の深さに対して、Java Formaterのメカニズムは明らかに簡単で、上の例が多いかもしれません。あなたが正則をよく知らないなら、java formaterはあなたが使うものを理解する価値があります。深いものではありませんが、確かによく使われています。
文法略説
フォーマットの説明
中かっこの表示([])はオプションのパラメータです。
  • レギュラータイプ、文字タイプと数値タイプの書式コードの文法は以下の通りです。
    %[argment_]index'[flags][width][.precision]conversion%[パラメータインデックス][識別セット][出力幅][.制限文字]はどのように文字をフォーマットするかを表記します。
  • 日付と時間の種類を表す書式コードの文法は以下の通りです。
    %[argment_]index$[flags][width]conversion conversionは、2文字からなるシーケンスです。最初の文字は't'または'T'です。2番目の文字は使用する書式を表します。
  • パラメータに対応していない
    %[flags][width]conversion
  • 識別セット(flags)
    全体のFormaterで一番分かりにくいのは標識集の使い方です。制限が大きくて、機能が強く見えません。
    以下はオフィシャルソースです。
    下表は支持されたマークをまとめました。yは、このフラグが指示パラメータタイプによってサポートされることを示します。従来の文字の整数浮動小数点の日付/時間の説明'-'y y y結果は左揃えとなります。'y 1-y 3 y-結果は、変換タイプに依存する代替形式'+'--y 4 y-結果を使用して、常にシンボル'--y 4 y-正の値を含むべきであり、結果としては、1つのプリアンブル'0'--y-結果をゼロで満たすことになる''--y 2 y 5-結果は、言語環境に特定されたグループセパレータ'('--y 4 y 5-結果は、括弧で囲まれる負の数1は、Formatableの定義に依存します。2は'd'変換にのみ適用されます。3は'o'、'x'、'X'変換にのみ適用されます。4 BigIntegerに対して'd'、'o'、'x'と'X'変換を適用する場合、または'd'変換をbyteおよびBytte、ショーツおよびShott、intおよびInteger、longおよびLongにそれぞれ適用する場合に適用します。5は'e'、'E'、'f'、'g'と'G'変換にのみ適用されます。
    内蔵して7つの標識の位があって、その上制限が多くて、それから1回の繰り返しを経て、ついに発見して、この標識の位は実は最大の作用はFormatableインターフェイスを実現するために使います。
    使用シーンを挙げます。
    たとえば記号の数の表示String.format("%1$+d",1 )出力+1この例は…ですが、特に要求がないと、このマークの使用を無視できます。
    タイプを変換
  • 従来-任意のパラメータタイプに適用可能
  • 文字-Unicode文字を表す基本タイプ:char、Charcter、byte、Bytte、shot、Shot。Charcter.isValidCodePoint(int)がtrueに戻ると、この変換をintとIntegerタイプ
  • 数値
  • 整数-Javaに使用できる整数タイプ:byte、Byte、shot、Shott、int、Integer、long、Long、Big Integer
  • 浮動点-Javaに使える浮動小数点タイプ:float、Float、double、Double、BigDecimal
  • 日付/時間−Javaに適用できる日付または時間をエンコードできるタイプ:long、Long、Calendar、Date。
  • 百分率-字面値'('\u 0025')
  • 行セパレータ-プラットフォームに特定された行セパレータ
  • その他の参考文献java.util.Formater
    付録
    日付のフォーマット処理が多いかもしれません。appi docの中の文書を直接コピーします。
    以下の日付と時間変換のサフィックス文字は't'と'T'の変換に定義されます。これらのタイプはGNU_dateとPOSIX_streftime(3 c)によって定義されるタイプに似ていますが、完全には同等ではありません。他の変換タイプが提供されるのは、「L」を秒のミリ秒として使用するように、Javaに特定の機能にアクセスするためである。
    次の変換文字は、時間をフォーマットするために使用されます。「H'24時間制の時間は、必要に応じて、プリアンブルゼロの2桁、すなわち00-23を持つようにフォーマットされています。」I'12時間制の時間は、必要に応じてプリアンブルゼロの2桁、すなわち01-12とフォーマットされている。k'24時間制の時間は0-23です。l'12時間制の時間は1-12です。M'時間の分は、必要に応じて、プリアンブルゼロの2桁、すなわち00-59とフォーマットされている。S'分の秒は、必要に応じて、プリアンブルゼロの2桁、すなわち00-60(「60」は、閏秒をサポートするために必要な特別な値)としてフォーマットされている。L'秒のミリ秒は、必要に応じて、プリアンブルゼロの三桁、000-999でフォーマットされている。N'秒のミリ秒は、必要に応じて、プリアンブルゼロの9桁、すなわち000000-99999を有するようにフォーマットされる。p'は、言語環境に特定される午前または午後のマークを小文字で表します。例えば、「am」または「pm」です。変換プレフィックス'T'を使用して、この出力を大文字に変換することができます。GMTのRFC 822フォーマットに対するz'のデジタルタイムゾーンオフセット、例えば-0800。Z'はタイムゾーンの略語形式の文字列を表します。Formaterの言語環境はパラメータの言語環境に取って代わられます。s'自协世界时(UTC)1970年1月1日00:00から现在までの秒数、すなわちLong.MIN_VALE/1000とLong.MAX_VALE/1000の差。Q'協調世界時(UTC)1970年1月1日00:00から現在までのミリ秒数、すなわちLong.MIN_VALEとLong.MAX_VALE間の差。
    以下の文字は日付をフォーマットするために使用されます。「B」は言語環境の月称で、例えば「January」と「Febrary」です。b'は言語環境に特定される月略称で、例えば「Jan」と「Feb」という。h'は'b'と同じです。A'は言語環境に特定された曜日全称で、例えば「Sunday」と「Monday」a'は言語環境に特定された曜日を略称します。例えば「Sun」と「Mon」「C」は100の4桁で表される年を除いて、必要に応じてプリアンブルゼロの2桁、つまり00-99'Y'年をフォーマットします。0092はグリ高利暦の92 CEに等しい。y'年の最後の二桁の数は、必要に応じて、プリアンブルゼロの二桁、つまり00-99を持つようにフォーマットされています。j'年の日数は、必要に応じて先頭ゼロを伴う3桁の数にフォーマットされています。例えば、グレゴリオ暦については001-366です。m'月は、必要に応じてプリアンブルゼロの2桁、すなわち01-13としてフォーマットされています。d'一ヶ月間の日数は、必要に応じて、先頭の桁がゼロの二桁である01-31'e'の一ヶ月間の日数として、二桁、つまり1-31としてフォーマットされています。
    共通の日付と時刻の組み合わせを書式設定する文字を以下のように変換します。R'24時間制の時間は「%tH:%tM」とフォーマットされています。T'24時間制の時間は「%tH:%tM:%tS」とフォーマットされています。r'12時間制の時間は「%tI:%tM:%tS%Tp」とフォーマットされています。午前または午後のマーク('%Tp')の位置は言語環境に関係があります。'D'日は「%tm/%td/%ty」とフォーマットされています。F'ISO 8601フォーマットの完全な日付は「%tY-%tm-%td」とフォーマットされています。c'日付と時間は、「%ta%tb%td%tT%tZ%tY」としてフォーマットされています。例えば、「Sun Jull 20 16:17:00 EDT 1969」です。
    変換として明確に定義されていない文字はすべて不正な文字で、将来の拡張のために保存されます。