Thank you everyone for the ideas! I haven't decided which method I'm going to use yet, I have a few days before I need to.
Just to see what would result, I spec'ed out another method from scratch. I'm curious how intuitive and readable others find it. If anyone cares to indulge me on that...
The format specifier starts with '%' as usual, followed immediately by the fully spelled out variable type (or typedef). Then optional other stuff, which you get no hints on. Finally, it's terminated with a ';'. See how fast you pick up on it from these examples:
"%I16;"
123 = "123"
-123 = "-123"
"%UI32 h;"
0x000000FF = "ff"
"%UI32 H 8;"
0x000000FF = "000000FF"
"%UI8 b 8;"
3 = "00000011"
"%Float;"
0 = "0"
1 = "1"
1.23 = "1.23"
1.237 = "1.237"
"%Float .2;"
0 = "0.00"
1 = "1.00"
1.23 = "1.23"
1.237 = "1.24"
"%Float .0-2;"
0 = "0"
1 = "1"
1.23 = "1.23"
1.237 = "1.24"
"%Float 3.3;"
1 = "001.000"
37.1827 = "037.183"
"%Float <12;"
-1.23 = "-1.23 "
"%Float , +s$ .2 >12;"
-1234.56 = " -$1,234.56"
1234.56 = " $1,234.56"
"%Float , +S$ .2 >12;"
-1234.56 = " -$1,234.56"
1234.56 = " +$1,234.56"
"%Float , +$S .2 >12;"
-1234.56 = " $-1,234.56"
1234.56 = " $+1,234.56"
"%Float .2 >12 +$S ,;"
-1234.56 = " $-1,234.56"
1234.56 = " $+1,234.56"