2010-05-23 14 views
5

Codice:Si tratta di un errore di stampa strutturata F #?

printfn "%10s" "abc" 
printfn "%-10s" "abc" 
printfn "%10d" 123 
printfn "%-10d" 123 
printfn "%10c" 'a' 
printfn "%-10c" 'a' 

uscita:

 abc 
abc 
     123 
123 
a 
a 

Così proprio allineamento %c non funziona come mi aspetto ...

F# 2.0 build 4.0.30319.1

risposta

6

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 
3

% c non è elencato nella table of valid types for F# printf. Forse è questa la causa del tuo problema.

Abbastanza strano, secondo la tabella non esiste un tipo per stampare caratteri singoli.

Problemi correlati