这是一个F#结构化的printf错误吗?

con*_*low 5 .net printf f#

码:

printfn "%10s"  "abc"
printfn "%-10s" "abc"
printfn "%10d"   123
printfn "%-10d"  123
printfn "%10c"   'a'
printfn "%-10c"  'a'
Run Code Online (Sandbox Code Playgroud)

输出:

       abc
abc
       123
123
a
a
Run Code Online (Sandbox Code Playgroud)

所以正确的对齐%c并不像我预期的那样有效......

F# 2.0 build 4.0.30319.1

Tom*_*cek 6

我不认为它在有效类型表中缺失的事实导致问题(肯定支持"%c"修饰符,因为类型printfn "%c"char -> unit你所期望的).所以,它看起来像是一个bug.

一个简单的解决方法是使用"%O"修饰符,它采用任何类型(也包括char值)并使用ToString方法对其进行格式化(对所有.NET类型都可用):

> printfn "%10O" 'a';;
         a
val it : unit
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

第(1)行格式化一个字符,它忽略width参数(这是您指定的宽度).那么,除非这是(由于某种原因,例如性能?)预期的行为,它真的感觉看起来像一个错误!

我想以下实现将解决问题(Brian ;-)!你在那里吗?):

| 'c', nobj::args -> 
  formatString outputChar info width 
    (string ((unbox nobj):char)) false; i+1,args 
Run Code Online (Sandbox Code Playgroud)