プレーンテキストの書式設定Plain text formatting

F # printf では、、、 printfn sprintf 、および関連する関数を使用して、プレーンテキストの型チェックがサポートされています。F# supports type-checked formatting of plain text using printf, printfn, sprintf, and related functions. たとえば、For example,

dotnet fsi

> printfn "Hello %s, %d + %d is %d" "world" 2 2 (2+2);;

出力を提供します。gives the output

Hello world, 2 + 2 is 4

F # では、構造化された値をプレーンテキストとして書式設定することもできます。F# also allows structured values to be formatted as plain text. たとえば、次の例では、出力を行列に似た組の表示として書式設定しています。For example, consider the following example that formats the output as a matrix-like display of tuples.

dotnet fsi

> printfn "%A" [ for i in 1 .. 5 -> [ for j in 1 .. 5 -> (i, j) ] ];;

[[(1, 1); (1, 2); (1, 3); (1, 4); (1, 5)];
 [(2, 1); (2, 2); (2, 3); (2, 4); (2, 5)];
 [(3, 1); (3, 2); (3, 3); (3, 4); (3, 5)];
 [(4, 1); (4, 2); (4, 3); (4, 4); (4, 5)];
 [(5, 1); (5, 2); (5, 3); (5, 4); (5, 5)]]

書式設定文字列の形式を使用すると、構造化されたプレーンテキストの書式設定がアクティブになり %A printf ます。Structured plain text formatting is activated when you use the %A format in printf formatting strings. また、F # interactive で値の出力を書式設定するときにもアクティブになります。出力には追加情報が含まれ、さらにカスタマイズも可能です。It's also activated when formatting the output of values in F# interactive, where the output includes extra information and is additionally customizable. プレーンテキストの書式設定は、 x.ToString() F # の共用体とレコードの値に対する呼び出しによっても監視できます。これには、デバッグ、ログ記録、およびその他のツールで暗黙的に発生する値も含まれます。Plain text formatting is also observable through any calls to x.ToString() on F# union and record values, including those that occur implicitly in debugging, logging, and other tooling.

printf書式指定文字列のチェックChecking of printf-format strings

書式指定 printf 文字列の printf 書式指定子に一致しない引数で書式関数を使用すると、コンパイル時エラーが報告されます。A compile-time error will be reported if a printf formatting function is used with an argument that doesn't match the printf format specifiers in the format string. たとえば、For example,

sprintf "Hello %s" (2+2)

出力を提供します。gives the output

  sprintf "Hello %s" (2+2)
  ----------------------^

stdin(3,25): error FS0001: The type 'string' does not match the type 'int'

技術的に言えば、 printf およびその他の関連する関数を使用する場合、F # コンパイラの特別な規則によって、書式指定文字列として渡されたリテラル文字列がチェックされます。これにより、適用される後続の引数が、使用される書式指定子と一致する正しい型になります。Technically speaking, when using printf and other related functions, a special rule in the F# compiler checks the string literal passed as the format string, ensuring the subsequent arguments applied are of the correct type to match the format specifiers used.

の書式指定子printfFormat specifiers for printf

形式の書式指定 printf は、形式を示すマーカーを含む文字列です %Format specifications for printf formats are strings with % markers that indicate format. 書式のプレースホルダー %[flags][width][.precision][type] は、型が次のように解釈される場所で構成されます。Format placeholders consist of %[flags][width][.precision][type] where the type is interpreted as follows:

書式指定子Format specifier 型 (s)Type(s) 解説Remarks
%b [bool]bool またはとして書式設定されます。 true``falseFormatted as true or false
%s stringstring エスケープ解除されたコンテンツとして書式設定Formatted as its unescaped contents
%c charchar 文字リテラルとして書式設定されます。Formatted as the character literal
%d, %i%d, %i 基本整数型a basic integer type 10進数の整数として書式設定され、基本整数型が符号付きの場合に符号が付きますFormatted as a decimal integer, signed if the basic integer type is signed
%u 基本整数型a basic integer type 符号なし10進整数として書式設定されます。Formatted as an unsigned decimal integer
%x, %X%x, %X 基本整数型a basic integer type 符号なし16進数値として書式設定されます (それぞれ16進数の場合は-f または A-F)Formatted as an unsigned hexadecimal number (a-f or A-F for hex digits respectively)
%o 基本整数型a basic integer type 符号なし8進数値として書式設定されます。Formatted as an unsigned octal number
%e, %E%e, %E 基本浮動小数点型a basic floating point type 形式を持つ符号付きの値として書式設定されます。 d は1桁の10進数、dddd は1桁以上の10進数、 [-]d.dddde[sign]ddd ddd は正確に3桁の10進数、sign は + またはです。-Formatted as a signed value having the form [-]d.dddde[sign]ddd where d is a single decimal digit, dddd is one or more decimal digits, ddd is exactly three decimal digits, and sign is + or -
%f 基本浮動小数点型a basic floating point type 形式を持つ符号付きの値として書式設定 [-]dddd.dddd dddd されます。ここで、は1つ以上の10進数です。Formatted as a signed value having the form [-]dddd.dddd, where dddd is one or more decimal digits. 整数部の桁数は、その数値の絶対値によって決定され、小数部の桁数は要求される精度によって決定されます。The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.
%g, %G%g, %G 基本浮動小数点型a basic floating point type を使用して、または形式で出力される符号付きの値として書式設定 %f %e されます。指定された値と有効桁数に対してはよりコンパクトになります。Formatted using as a signed value printed in %f or %e format, whichever is more compact for the given value and precision.
%M System.Decimala System.Decimal value の書式指定子を使用して書式設定されます。 "G"``System.Decimal.ToString(format)Formatted using the "G" format specifier for System.Decimal.ToString(format)
%O 任意の値any value オブジェクトのボックス化とそのメソッドの呼び出しによって書式設定されます。 System.Object.ToString()Formatted by boxing the object and calling its System.Object.ToString() method
%A 任意の値any value 既定のレイアウト設定で構造化されたプレーンテキストの書式設定を使用して書式設定Formatted using structured plain text formatting with the default layout settings
%a 任意の値any value 2つの引数が必要です。コンテキストパラメーターと値を受け入れる書式設定関数と、出力する特定の値です。Requires two arguments: a formatting function accepting a context parameter and the value, and the particular value to print
%t 任意の値any value 1つの引数が必要です。適切なテキストを出力または返すコンテキストパラメーターを受け入れる書式設定関数Requires one argument: a formatting function accepting a context parameter that either outputs or returns the appropriate text
%% (なし)(none) 引数を必要とせず、普通のパーセント記号を出力します。%Requires no arguments and prints a plain percent sign: %

基本整数型は、 byte ( System.Byte )、 sbyte ()、 System.SByte int16 ( System.Int16 )、 uint16 ( System.UInt16 )、 int32 ( System.Int32 )、( uint32 System.UInt32 )、( int64 System.Int64 )、( uint64 System.UInt64 )、 nativeint ()、 System.IntPtr および unativeint ( System.UIntPtr ) です。Basic integer types are byte (System.Byte), sbyte (System.SByte), int16 (System.Int16), uint16 (System.UInt16), int32 (System.Int32), uint32 (System.UInt32), int64 (System.Int64), uint64 (System.UInt64), nativeint (System.IntPtr), and unativeint (System.UIntPtr). 基本浮動小数点型 floatSystem.Double 、() および float32 ( System.Single ) です。Basic floating point types are float (System.Double) and float32 (System.Single).

省略可能な幅は、結果の最小幅を示す整数です。The optional width is an integer indicating the minimal width of the result. たとえば、は %6d 整数を出力し、少なくとも6文字を埋めるためにスペースをプレフィックスとして付けます。For instance, %6d prints an integer, prefixing it with spaces to fill at least six characters. Width がの場合は * 、対応する幅を指定するために追加の整数引数が使用されます。If width is *, then an extra integer argument is taken to specify the corresponding width.

有効なフラグは次のとおりです。Valid flags are:

フラグFlag 効果Effect 解説Remarks
0 必要な幅を構成するために、スペースではなくゼロを追加します。Add zeros instead of spaces to make up the required width
- 指定された幅の範囲内で結果を左揃えにしますLeft justify the result within the specified width
+ +数値が正の場合に文字を追加します ( - 負の符号に一致させるため)Add a + character if the number is positive (to match a - sign for negatives)
空白文字space character 数値が正の値の場合は余分なスペースを追加します (ネガの符号 '-' と一致させるため)Add an extra space if the number is positive (to match a '-' sign for negatives)

Printf フラグが無効であり、使用されて # いる場合、コンパイル時エラーが報告されます。The printf # flag is invalid and a compile-time error will be reported if it is used.

値は、インバリアントカルチャを使用して書式設定されます。Values are formatted using invariant culture. カルチャ設定は、書式設定 printf の結果に影響を与える場合を除き、書式設定には関係あり %O %A ません。Culture settings are irrelevant to printf formatting except when they affect the results of %O and %A formatting. 詳細については、「構造化されたプレーンテキストの書式設定」を参照してください。For more information, see structured plain text formatting.

%A書式設定%A formatting

%A書式指定子は、ユーザーが判読できる方法で値の書式を設定するために使用されます。また、診断情報の報告にも役立ちます。The %A format specifier is used to format values in a human-readable way, and can also be useful for reporting diagnostic information.

プリミティブ値Primitive values

指定子を使用してプレーンテキストの書式を設定すると %A 、F # の数値はサフィックスとインバリアントカルチャを使用して書式設定されます。When formatting plain text using the %A specifier, F# numeric values are formatted with their suffix and invariant culture. 浮動小数点値は、浮動小数点の有効桁数の10の位置を使用して書式設定されます。Floating point values are formatted using 10 places of floating point precision. たとえば、For example,

printfn "%A" (1L, 3n, 5u, 7, 4.03f, 5.000000001, 5.0000000001)

枝分かれproduces

(1L, 3n, 5u, 7, 4.03000021f, 5.000000001, 5.0)

指定子を使用する場合 %A 、文字列は引用符を使用して書式設定されます。When using the %A specifier, strings are formatted using quotes. エスケープコードは追加されず、生の文字が出力されます。Escape codes are not added and instead the raw characters are printed. たとえば、For example,

printfn "%A" ("abc", "a\tb\nc\"d")

枝分かれproduces

("abc", "a      b
c"d")

.NET の値.NET values

指定子を使用してプレーンテキストを書式設定する場合 %A 、F # 以外の .net オブジェクトは、 x.ToString() およびで指定された .net の既定の設定を使用して書式設定され System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture ます。When formatting plain text using the %A specifier, non-F# .NET objects are formatted by using x.ToString() using the default settings of .NET given by System.Globalization.CultureInfo.CurrentCulture and System.Globalization.CultureInfo.CurrentUICulture. たとえば、For example,

open System.Globalization

let date = System.DateTime(1999, 12, 31)

CultureInfo.CurrentCulture <- CultureInfo.GetCultureInfo("de-DE")
printfn "Culture 1: %A" date

CultureInfo.CurrentCulture <- CultureInfo.GetCultureInfo("en-US")
printfn "Culture 2: %A" date

枝分かれproduces

Culture 1: 31.12.1999 00:00:00
Culture 2: 12/31/1999 12:00:00 AM

構造化された値Structured values

指定子を使用してプレーンテキストを書式設定する場合 %A 、F # のリストと組に対してブロックインデントが使用されます。When formatting plain text using the %A specifier, block indentation is used for F# lists and tuples. これは、前の例で示したようになっています。This shown in the previous example. 多次元配列を含む配列の構造も使用されます。The structure of arrays is also used, including multi-dimensional arrays. 1次元配列は、構文と共に表示され [| ... |] ます。Single-dimensional arrays are shown with [| ... |] syntax. たとえば、For example,

printfn "%A" [| for i in 1 .. 20 -> (i, i*i) |]

枝分かれproduces

[|(1, 1); (2, 4); (3, 9); (4, 16); (5, 25); (6, 36); (7, 49); (8, 64); (9, 81);
  (10, 100); (11, 121); (12, 144); (13, 169); (14, 196); (15, 225); (16, 256);
  (17, 289); (18, 324); (19, 361); (20, 400)|]

既定の印刷幅は80です。The default print width is 80. この幅は、書式指定子の印刷幅を使用してカスタマイズできます。This width can be customized by using a print width in the format specifier. たとえば、For example,

printfn "%10A" [| for i in 1 .. 5 -> (i, i*i) |]

printfn "%20A" [| for i in 1 .. 5 -> (i, i*i) |]

printfn "%50A" [| for i in 1 .. 5 -> (i, i*i) |]

枝分かれproduces

[|(1, 1);
  (2, 4);
  (3, 9);
  (4, 16);
  (5, 25)|]
[|(1, 1); (2, 4);
  (3, 9); (4, 16);
  (5, 25)|]
[|(1, 1); (2, 4); (3, 9); (4, 16); (5, 25)|]

印刷幅を0に指定すると、印刷幅が使用されなくなります。Specifying a print width of 0 results in no print width being used. 出力内の埋め込み文字列に改行が含まれている場合を除き、1行のテキストが生成されます。A single line of text will result, except where embedded strings in the output contain line breaks. 次に例を示します。For example

printfn "%0A" [| for i in 1 .. 5 -> (i, i*i) |]

printfn "%0A" [| for i in 1 .. 5 -> "abc\ndef" |]

枝分かれproduces

[|(1, 1); (2, 4); (3, 9); (4, 16); (5, 25)|]
[|"abc
def"; "abc
def"; "abc
def"; "abc
def"; "abc
def"|]

深さの制限4は、として表示される sequence () 値に使用され IEnumerable seq { ...} ます。A depth limit of 4 is used for sequence (IEnumerable) values, which are shown as seq { ...}. 深さの制限100は、リストと配列の値に使用されます。A depth limit of 100 is used for list and array values. たとえば、For example,

printfn "%A" (seq { for i in 1 .. 10 -> (i, i*i) })

枝分かれproduces

seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]

ブロックインデントは、パブリックレコードと共用体の値の構造にも使用されます。Block indentation is also used for the structure of public record and union values. たとえば、For example,

type R = { X : int list; Y : string list }

printfn "%A" { X =  [ 1;2;3 ]; Y = ["one"; "two"; "three"] }

枝分かれproduces

{ X = [1; 2; 3]
  Y = ["one"; "two"; "three"] }

%+A 使用すると、レコードと共用体のプライベート構造もリフレクションを使用して明らかになります。If %+A is used, then the private structure of records and unions is also revealed by using reflection. 次に例を示します。For example

type internal R =
    { X : int list; Y : string list }
    override _.ToString() = "R"

let internal data = { X = [ 1;2;3 ]; Y = ["one"; "two"; "three"] }

printfn "external view:\n%A" data

printfn "internal view:\n%+A" data

枝分かれproduces

external view:
R

internal view:
{ X = [1; 2; 3]
  Y = ["one"; "two"; "three"] }

大きい、循環、または深い入れ子になった値Large, cyclic, or deeply nested values

大規模な構造化値は、全体のオブジェクトノード数の上限である1万に書式設定されます。Large structured values are formatted to a maximum overall object node count of 10000. 深い入れ子になった値は、深さが100に設定されます。Deeply nested values are formatted to a depth of 100. どちらの場合も ... 、を使用して出力の一部を除外します。In both cases ... is used to elide some of the output. たとえば、For example,

type Tree =
    | Tip
    | Node of Tree * Tree

let rec make n =
    if n = 0 then
        Tip
    else
        Node(Tip, make (n-1))

printfn "%A" (make 1000)

一部の部分を省略して、大きな出力を生成します。produces a large output with some parts elided:

Node(Tip, Node(Tip, ....Node (..., ...)...))

サイクルは、オブジェクトグラフで検出され、 ... サイクルが検出された場所で使用されます。Cycles are detected in the object graphs and ... is used at places where cycles are detected. 次に例を示します。For example

type R = { mutable Links: R list }
let r = { Links = [] }
r.Links <- [r]
printfn "%A" r

枝分かれproduces

{ Links = [...] }

Lazy、null、および関数の値Lazy, null, and function values

遅延値は Value is not created 、値がまだ評価されていない場合、または同等のテキストとして出力されます。Lazy values are printed as Value is not created or equivalent text when the value has not yet been evaluated.

Null 値はとして出力され null ます。ただし、値の静的な型が共用体型であると判断された場合 null は、が許可された表現になります。Null values are printed as null unless the static type of the value is determined to be a union type where null is a permitted representation.

F # 関数の値は、内部で生成されたクロージャ名として出力されます。たとえば、のように <fun:it@43-7> なります。F# function values are printed as their internally generated closure name, for example, <fun:it@43-7>.

プレーンテキストの書式設定をでカスタマイズするStructuredFormatDisplayCustomize plain text formatting with StructuredFormatDisplay

指定子を使用する場合 %AStructuredFormatDisplay 型宣言に属性が存在することが尊重されます。When using the %A specifier, the presence of the StructuredFormatDisplay attribute on type declarations is respected. これを使用すると、サロゲートテキストおよびプロパティを指定して値を表示できます。This can be used to specify surrogate text and property to display a value. 以下に例を示します。For example:

[<StructuredFormatDisplay("Counts({Clicks})")>]
type Counts = { Clicks:int list}

printfn "%20A" {Clicks=[0..20]}

枝分かれproduces

Counts([0; 1; 2; 3;
        4; 5; 6; 7;
        8; 9; 10; 11;
        12; 13; 14;
        15; 16; 17;
        18; 19; 20])

オーバーライドしてプレーンテキストの書式設定をカスタマイズするToStringCustomize plain text formatting by overriding ToString

の既定の実装 ToString は、F # プログラミングで監視できます。The default implementation of ToString is observable in F# programming. 多くの場合、既定の結果は、プログラマによる情報の表示またはユーザー出力での使用に適しているわけではありません。そのため、既定の実装をオーバーライドするのが一般的です。Often, the default results aren't suitable for use in either programmer-facing information display or user output, and as a result it is common to override the default implementation.

既定では、F # のレコード型と共用体型は、を使用する実装でのの実装をオーバーライドし ToString sprintf "%+A" ます。By default, F# record and union types override the implementation of ToString with an implementation that uses sprintf "%+A". たとえば、For example,

type Counts = { Clicks:int list }

printfn "%s" ({Clicks=[0..10]}.ToString())

枝分かれproduces

{ Clicks = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10] }

クラス型の場合、の既定の実装は提供されず、 ToString .net の既定値が使用されます。これは、型の名前を報告します。For class types, no default implementation of ToString is provided and the .NET default is used, which reports the name of the type. たとえば、For example,

type MyClassType(clicks: int list) =
   member _.Clicks = clicks

let data = [ MyClassType([1..5]); MyClassType([1..5]) ]
printfn "Default structured print gives this:\n%A" data
printfn "Default ToString gives:\n%s" (data.ToString())

枝分かれproduces

Default structured print gives this:
[MyClassType; MyClassType]
Default ToString gives:
[MyClassType; MyClassType]

のオーバーライドを追加すると、 ToString 書式設定が向上します。Adding an override for ToString can give better formatting.

type MyClassType(clicks: int list) =
   member _.Clicks = clicks
   override _.ToString() = sprintf "MyClassType(%0A)" clicks

let data = [ MyClassType([1..5]); MyClassType([1..5]) ]
printfn "Now structured print gives this:\n%A" data
printfn "Now ToString gives:\n%s" (data.ToString())

枝分かれproduces

Now structured print gives this:
[MyClassType([1; 2; 3; 4; 5]); MyClassType([1; 2; 3; 4; 5])]
Now ToString gives:
[MyClassType([1; 2; 3; 4; 5]); MyClassType([1; 2; 3; 4; 5])]

構造化された印刷の F# インタラクティブF# Interactive structured printing

F# インタラクティブ ( dotnet fsi ) では、構造化されたプレーンテキスト形式の拡張バージョンを使用して値を報告し、追加のカスタマイズを可能にします。F# Interactive (dotnet fsi) uses an extended version of structured plain text formatting to report values and allows additional customizability. 詳細については、「 F# インタラクティブ」を参照してください。For more information, see F# Interactive.

デバッグディスプレイのカスタマイズCustomize debug displays

.NET 用のデバッガーは、やなどの属性の使用を尊重 DebuggerDisplay DebuggerTypeProxy し、デバッガーの検査ウィンドウでのオブジェクトの構造化表示に影響します。Debuggers for .NET respect the use of attributes such as DebuggerDisplay and DebuggerTypeProxy, and these affect the structured display of objects in debugger inspection windows. F # コンパイラは、判別された共用体型とレコード型に対してこれらの属性を自動的に生成しましたが、クラス、インターフェイス、または構造体型には対応していません。The F# compiler automatically generated these attributes for discriminated union and record types, but not class, interface, or struct types.

F # プレーンテキストの書式設定では、これらの属性は無視されますが、F # の型をデバッグするときに表示を改善するためにこれらのメソッドを実装すると便利な場合があります。These attributes are ignored in F# plain text formatting, but it can be useful to implement these methods to improve displays when debugging F# types.

関連項目See also