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

时间:2010-05-23 12:33:09

标签: .net f# printf

代码:

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

2 个答案:

答案 0 :(得分:6)

我认为有效类型表中缺少它的事实导致了这个问题(肯定支持“%c”修饰符,因为printfn "%c"的类型是{{1}正如你所料)。所以,它对我来说确实是一个错误。

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

ToString

BTW:我查看了F#库的源代码(来自CTP版本),这里是> printfn "%10O" 'a';; a val it : unit 的相关位(第478行):

printf.fs

第(1)行格式化一个字符,它忽略| '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 参数(这是您指定的宽度)。那么,除非这是(出于某种原因,例如性能?)预期的行为,否则它看起来真是一个错误!

我认为以下实现可以解决问题( Brian ;-)!你在吗?):

width

答案 1 :(得分:3)

%c未列在table of valid types for F# printf中。也许这就是你问题的原因。

很奇怪,根据表格,根本没有打印单个字符的类型。