2010-05-23 29 views

回答

6

我不認爲它在有效類型表中缺少的事實導致問題(「%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