Düz metin biçimlendirme

F #,,, printf printfn ve ilgili işlevleri kullanılarak düz metnin tür denetimli biçimlendirmesini destekler sprintf . Örneğin,

dotnet fsi

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

çıktıyı verir

Hello world, 2 + 2 is 4

F # yapılandırılmış değerlerin düz metin olarak biçimlendirilmesini de sağlar. Örneğin, çıktıyı matris benzeri bir görünüm olarak biçimlendiren aşağıdaki örneği göz önünde bulundurun.

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)]]

%ABiçimlendirme dizelerinde biçimi kullandığınızda yapılandırılmış düz metin biçimlendirmesi etkinleştirilir printf . Ayrıca, çıktının ek bilgi içerdiği ve ek olarak özelleştirilebilen F # Interactive 'teki değerlerin çıktısı biçimlendirilirken de etkinleştirilir. Düz metin biçimlendirme Ayrıca, x.ToString() hata ayıklama, günlüğe kaydetme ve diğer araç oluşturma ile ilgili olarak oluşan, F # UNION ve kayıt değerleri üzerinde yapılan çağrılar aracılığıyla da Observable ' dır.

printfBiçimlendirme dizeleri denetleniyor

printfBiçim dizesindeki printf biçim belirticileriyle eşleşmeyen bir bağımsız değişkenle bir biçimlendirme işlevi kullanılıyorsa, derleme zamanı hatası bildirilir. Örneğin,

sprintf "Hello %s" (2+2)

çıktıyı verir

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

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

Teknik olarak, printf ve diğer ilgili işlevleri kullanırken, F # derleyicisindeki özel bir kural, biçim dizesi olarak geçirilen dize değişmez değerini denetler ve sonraki bağımsız değişkenlerin, kullanılan biçim belirticileriyle eşleşecek şekilde doğru türde olmasını sağlar.

İçin biçim belirticileri printf

Biçimlerin biçim belirtimleri printf % biçimi gösteren işaretçilerle dizelerdir. Biçim yer tutucuları %[flags][width][.precision][type] , türün şu şekilde yorumlanması durumunda oluşur:

Biçim belirteci Tür (ler) Açıklamalar
%b bool (System.Boolean) Veya olarak biçimlendirilir true``false
%s string (System.String) Kaçışsız içerikleri olarak biçimlendirilir
%c char (System.Char) Karakter sabiti olarak biçimlendirilir
%d, %i temel bir tamsayı türü Temel tamsayı türü imzalanmışsa, bir ondalık tamsayı olarak biçimlendirilir, imzalandı
%u temel bir tamsayı türü İşaretsiz ondalık tamsayı olarak biçimlendirilir
%x, %X temel bir tamsayı türü İşaretsiz onaltılık sayı (sırasıyla onaltılık basamaklar için a-f veya A-F) olarak biçimlendirilir
%o temel bir tamsayı türü İşaretsiz sekizlik sayı olarak biçimlendirilir
%B temel bir tamsayı türü İşaretsiz bir ikili sayı olarak biçimlendirilir
%e, %E temel kayan nokta türü [-]d.dddde[sign]dddD 'nin tek bir ondalık basamak olduğu, yani gggg bir veya daha fazla ondalık basamak, DDD ise yalnızca üç ondalık basamak ve oturum açma + ya da-
%f, %F temel kayan nokta türü [-]dddd.dddd dddd Bir veya daha fazla ondalık basamak olmak üzere, forma sahip imzalı bir değer olarak biçimlendirilir. Ondalık noktadan önceki basamak sayısı sayının büyüklüğüne ve ondalık ayırıcıdan sonraki basamak sayısı, istenen duyarlığa bağlıdır.
%g, %G temel kayan nokta türü %f %e Belirtilen değer ve duyarlık için daha küçük olduğu için, veya biçiminde yazdırılmış bir imzalı değer olarak kullanılarak biçimlendirilir.
%M a decimal ( System.Decimal ) değeri "G"Biçim belirleyicisi kullanılarak biçimlendirilirSystem.Decimal.ToString(format)
%O herhangi bir değer Nesnesi kutulama yaparak ve metodunu çağırarak biçimlendirilir System.Object.ToString()
%A herhangi bir değer Varsayılan düzen ayarlarıyla yapılandırılmış düz metin biçimlendirme kullanılarak biçimlendirildi
%a herhangi bir değer İki bağımsız değişken gerektirir: bir bağlam parametresini ve değeri kabul eden bir biçimlendirme işlevi ve yazdırılacak belirli değer
%t herhangi bir değer Bir bağımsız değişken gerektirir: bir bağlam parametresini kabul eden veya uygun metni döndüren bir biçimlendirme işlevi
%% (yok) Bağımsız değişken gerektirmez ve bir salt yüzde işareti yazdırır: %

Temel tamsayı türleri 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 (), (), ve (). Temel kayan nokta türleri float ( System.Double ), float32 ( System.Single ) ve decimal ( System.Decimal ).

İsteğe bağlı genişlik, sonucun en az genişliğini gösteren bir tamsayıdır. Örneğin, %6d bir tamsayı yazdırır, en az altı karakteri dolduracak şekilde boşluk ile önek olarak. Width ise * , karşılık gelen genişliği belirtmek için fazladan bir tamsayı bağımsız değişkeni alınır.

Geçerli bayraklar şunlardır:

Bayrak Etki Açıklamalar
0 Gerekli genişliği oluşturmak için boşluk yerine sıfır ekleyin
- Sonucu belirtilen genişlik içinde Sola Yasla
+ +Sayı pozitifse ( - negatifler için bir işareti eşlemek için) bir karakter ekleyin
boşluk karakteri Sayı pozitif ise (örneğin, negatifler için '-' işaretini eşlemek için) fazladan bir boşluk ekleyin

Printf # bayrağı geçersiz ve kullanılıyorsa bir derleme zamanı hatası bildirilir.

Değerler, sabit kültür kullanılarak biçimlendirilir. Kültür ayarları, printf ve biçimlendirme sonuçlarının etkilenmediği durumlar dışında biçimlendirme ile ilgisiz %O değildir %A . Daha fazla bilgi için bkz. yapılandırılmış düz metin biçimlendirmesi.

%A biçime

%ABiçim Belirleyicisi, verileri insanlarca okunabilir bir şekilde biçimlendirmek için kullanılır ve ayrıca tanılama bilgilerini raporlamak için yararlı olabilir.

İlkel değerler

Belirteci kullanarak düz metin biçimlendirilirken %A , F # sayısal değerleri, soneki ve sabit kültürüyle biçimlendirilir. Kayan nokta değerleri, kayan nokta duyarlılığı 10 ' un kullanılarak biçimlendirilir. Örneğin,

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

üretmez

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

%ATanımlayıcı kullanılırken dizeler, tırnak işaretleri kullanılarak biçimlendirilir. Kaçış kodları eklenmez ve bunun yerine ham karakterler yazdırılır. Örneğin,

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

üretmez

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

.NET değerleri

Tanımlayıcı kullanılarak düz metin biçimlendirilirken %A , F # .NET nesneleri, x.ToString() ve tarafından verilen varsayılan .NET ayarları kullanılarak biçimlendirilir System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.CurrentUICulture . Örneğin,

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

üretmez

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

Yapılandırılmış değerler

Belirteci kullanarak düz metin biçimlendirilirken %A , blok girintileme F # listeleri ve tanımlama grupları için kullanılır. Bu, önceki örnekte gösterilmiştir. Birden çok boyutlu diziler de dahil olmak üzere dizilerin yapısı da kullanılır. Tek boyutlu diziler sözdizimi ile gösterilir [| ... |] . Örneğin,

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

üretmez

[|(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)|]

Varsayılan yazdırma genişliği 80 ' dir. Bu genişlik, biçim tanımlayıcıda bir yazdırma genişliği kullanılarak özelleştirilebilir. Örneğin,

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) |]

üretmez

[|(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 yazdırma genişliğini belirtmek, hiçbir yazdırma genişliği kullanılmazsa sonuç olarak sonuçlanır. Çıktıda gömülü dizelerin satır sonları içermesi dışında, tek satırlık bir metin oluşur. Örneğin:

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

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

üretmez

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

İçinde gösterilen dizi () değerleri için 4 derinlik sınırı kullanılır IEnumerable seq { ...} . Liste ve dizi değerleri için 100 derinlik sınırı kullanılır. Örneğin,

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

üretmez

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

Blok girintileme, ortak kayıt ve birleşim değerlerinin yapısı için de kullanılır. Örneğin,

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

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

üretmez

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

Kullanılıyorsa %+A , kayıt ve birleşimlerin özel yapısı da yansıma kullanılarak da ortaya kaydedilir. Örneğin:

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

üretmez

external view:
R

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

Büyük, döngüsel veya derin iç içe geçmiş değerler

Büyük yapılandırılmış değerler 10000 genel nesne düğümü sayısı üst sınırına biçimlendirilir. Derin iç içe geçmiş değerler 100 derinliğine biçimlendirilir. Her iki durumda da ... çıktının bir kısmını almak için kullanılır. Örneğin,

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)

bazı parçalar olmadan büyük bir çıkış üretir:

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

Döngü, nesne grafiklerde algılanır ve ... döngülerin algılandığı yerlerde kullanılır. Örneğin:

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

üretmez

{ Links = [...] }

Lazy, null ve işlev değerleri

Value is not createdDeğer henüz değerlendirilmemişse, yavaş değerler veya eşit metin olarak yazdırılır.

nullDeğer statik türünün, null izin verilen bir temsil olduğu bir birleşim türü olarak belirlenmediği sürece null değerler yazdırılır.

F # işlev değerleri, dahili olarak oluşturulan kapanış adı olarak yazdırılır (örneğin,) <fun:it@43-7> .

Düz metin biçimlendirmesini özelleştirme StructuredFormatDisplay

%ATanımlayıcı kullanılırken, StructuredFormatDisplay tür bildirimlerinde özniteliği varlığını dikkate alır. Bu, bir değeri göstermek için yedek metin ve özellik belirtmek için kullanılabilir. Örnek:

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

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

üretmez

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

Düz metin biçimlendirmesini geçersiz kılarak özelleştirin ToString

Varsayılan uygulama, ToString F # programlamasında Observable ' dır. Genellikle, varsayılan sonuçlar programcı ile ilgili bilgi görüntüsü veya Kullanıcı çıktısında kullanım için uygun değildir ve sonuç olarak varsayılan uygulamayı geçersiz kılmak yaygın bir işlemdir.

Varsayılan olarak, F # kayıt ve birleşim türleri tarafından ToString kullanılan bir uygulamayla uygulamasını geçersiz kılar sprintf "%+A" . Örneğin,

type Counts = { Clicks:int list }

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

üretmez

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

Sınıf türleri için, varsayılan bir uygulama ToString sağlanmaz ve .net varsayılanı kullanılır ve bu da türün adını bildirir. Örneğin,

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())

üretmez

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

İçin bir geçersiz kılma eklemek ToString daha iyi biçimlendirme sağlayabilir.

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())

üretmez

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])]

Yapılandırılmış yazdırma F# Etkileşimli

F# Etkileşimli ( dotnet fsi ), değerleri raporlamak için yapılandırılmış düz metin biçimlendirmesinin genişletilmiş bir sürümünü kullanır ve ek özelleştirme sağlar. Daha fazla bilgi için bkz. F# Etkileşimli.

Hata ayıklama ekranları Özelleştir

.NET için hata ayıklayıcılar, ve gibi özniteliklerin kullanımına saygı DebuggerDisplay DebuggerTypeProxy gösterir ve bu, hata ayıklayıcı İnceleme penceresinde nesnelerin yapılandırılmış görüntüsünü etkiler. F # derleyicisi ayırt edici birleşim ve kayıt türleri için bu öznitelikleri otomatik olarak oluşturdu, ancak sınıf, arabirim veya yapı türleri değil.

Bu öznitelikler F # düz metin biçimlendirmesinde yok sayılır, ancak F # türlerinde hata ayıklarken ekranları geliştirmek için bu yöntemleri uygulamak yararlı olabilir.

Ayrıca bkz.