Non penso che il fatto che manchi nella tabella dei tipi validi causa il problema (il modificatore "% c" è sicuramente supportato, perché il tipo di printfn "%c"
è char -> unit
come ci si aspetterebbe). Quindi, sembra un bug per me.
Una soluzione semplice è quella di utilizzare il modificatore "% O" che prende qualsiasi tipo (anche compreso char
valori) e formatta utilizzando ToString
metodo (disponibile per tutti i tipi NET):
> printfn "%10O" 'a';;
a
val it : unit
BTW: ho guardato il codice sorgente # libreria F (dalla versione CTP) e qui è il bit rilevante da printf.fs
(linea 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
La linea (1) formatta un carattere e ignora il parametro width
(che è la larghezza specificata). Quindi, a meno che questo non sia (per qualche ragione, ad esempio, le prestazioni?) Il comportamento previsto, sembra davvero un bug!
Suppongo che la seguente implementazione risolva il problema (Brian ;-)! Sei qui?):
| 'c', nobj::args ->
formatString outputChar info width
(string ((unbox nobj):char)) false; i+1,args
fonte
2010-05-23 13:33:32