printfn "%10s" "abc"
printfn "%-10s" "abc"
printfn "%10d" 123
printfn "%-10d" 123
printfn "%10c" 'a'
printfn "%-10c" 'a'
輸出:
abc
abc
123
123
a
a
所以,正確對齊%c
如我所料不工作...
F# 2.0 build 4.0.30319.1
printfn "%10s" "abc"
printfn "%-10s" "abc"
printfn "%10d" 123
printfn "%-10d" 123
printfn "%10c" 'a'
printfn "%-10c" 'a'
輸出:
abc
abc
123
123
a
a
所以,正確對齊%c
如我所料不工作...
F# 2.0 build 4.0.30319.1
我不認爲它在有效類型表中缺少的事實導致問題(「%c」修飾符肯定受支持,因爲printfn "%c"
的類型是char -> unit
,正如您所期望的那樣)。所以,它看起來像一個bug。
一個簡單的解決方法是使用 「%O」 的改性劑,它需要的任何類型的(也包括char
值),並使用ToString
方法它格式(avaliable所有.NET類型):
> printfn "%10O" 'a';;
a
val it : unit
BTW:我看了一下F#庫的源代碼(從CTP版本),這裏是從printf.fs
的相關位(線478):
| 's',nobj::args ->
formatString outputChar info width (unbox nobj) false; i+1,args
| 'c',nobj::args ->
outputChar (unbox nobj); i+1,args // (1)
| 'b',nobj::args ->
formatString outputChar info width
(if (unbox nobj) then "true" else "false") false; i+1,args
| 'O',xobj::args ->
formatString outputChar info width
(match xobj with null -> "<null>" | _ -> xobj.ToString()) false; i+1,args
第(1)行格式化一個字符,它忽略width
參數(這是您指定的寬度)。所以,除非這是(出於某種原因,例如性能?)預期的行爲,它真的感覺看起來是一個錯誤!
我想下面的實現會解決這個問題(Brian ;-)!你在嗎?):
| 'c', nobj::args ->
formatString outputChar info width
(string ((unbox nobj):char)) false; i+1,args
%c未在上市table of valid types for F# printf。也許這是你的問題的原因。
很奇怪,根據表格,根本沒有打印單個字符的類型。