Код:
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
, как и следовало ожидать). Так что, на мой взгляд, это действительно похоже на ошибку.
Простым обходным решением является использование модификатора "%O", который принимает любой тип (включая также значения char
) и форматирует его с помощью метода ToString
(доступного для всех . 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
(который является шириной, которую вы указали). Так что, если только это (по какой-то причине, например, производительность?) не является запланированным поведением, это действительно похоже на ошибку!
Я полагаю, что следующая реализация исправит проблему (Брайан ;-)! Ты там?):
| 'c', nobj::args ->
formatString outputChar info width
(string ((unbox nobj):char)) false; i+1,args
% c не указан в таблице допустимых типов для F # printf . Может, в этом причина твоей проблемы.
Как ни странно, согласно таблице вообще нет типа для печати одиночных символов.