2010-05-23 9 views
5

code:Est-ce un bug printf structuré en F #?

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

Sortie:

 abc 
abc 
     123 
123 
a 
a 

Ainsi l'alignement droit %c ne fonctionne pas comme je m'y attends ...

F# 2.0 build 4.0.30319.1

Répondre

6

Je ne pense pas que le fait qu'il manque dans la table des types valides cause le problème (le modificateur "% c" est définitivement supporté, parce que le type de printfn "%c" est char -> unit comme on peut s'y attendre). Donc, ça ressemble à un bug pour moi.

Une solution simple est d'utiliser le modificateur "% O" qui prend tout type (comprenant également char valeurs) et les formats à l'aide de la méthode ToString (avaliable pour tous les types de NET):

> printfn "%10O" 'a';; 
     a 
val it : unit 

BTW: Je regardé le code source de la bibliothèque F # (à partir de la version CTP) et voici le bit correspondant de printf.fs (ligne 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 ligne (1) formate un caractère et ignore le paramètre width (qui correspond à la largeur que vous avez spécifiée). Donc, à moins que cela ne soit (pour une raison quelconque, par exemple la performance?) Un comportement voulu, cela semble vraiment être un bug!

Je suppose que l'implémentation suivante permettrait de résoudre le problème (Brian ;-)! Êtes-vous là?):

| 'c', nobj::args -> 
    formatString outputChar info width 
    (string ((unbox nobj):char)) false; i+1,args 
3

% c ne figure pas dans la table of valid types for F# printf. Peut-être que c'est la cause de votre problème. Assez étrange, selon la table il n'y a pas de type pour imprimer des caractères uniques du tout.