Version 18 of format

Updated 2007-02-09 14:05:24

format - Format a string in the style of sprintf

 format formatString ?arg arg ...?  

This command generates a formatted string in the same way as the ANSI C sprintf procedure (it uses sprintf in its implementation). FormatString indicates how to format the result, using % conversion specifiers as in sprintf, and the additional arguments, if any, provide values to be substituted into the result. The return value from format is the formatted string.

Tcl 8.4 doc at: http://purl.org/tcl/home/man/tcl8.4/TclCmd/format.htm

Tcl 8.5 doc at: http://purl.org/tcl/home/man/tcl8.5/TclCmd/format.htm


LV The man page for 8.4 is missing examples. 8.5 is better, but I'm looking for an example of the following. I have a report line that I am trying to fill out. It consists of a time stamp, a date stamp, and 2 text strings. each of these items must begin in a specific column.

 set g "OHIO"
 set fmtg [format "%-25.25s" $g]
 puts [string length "$fmtg"] 

The man page is complex enough that I want to be certain that I am not missing something. This seems to ensure that if g is longer than 25 characters, it is truncated, and if it is shorter than 25 characters, that it is left justified and blank padded. Are there any gotchas of which I need to be aware?


Tips and Tricks with format

You can use [format] to produce unsigned integers for display (but don't reckon with them - for expr they're still signed!):

 % format %u -1
 4294967295

See floating-point formatting for discussion on how to write format strings to handle floats...


To make numbers look nice:

 set fah [format "%0.2f" [expr $temperature_cel * 9 / 5 + 32]]

Color formatting:

 set color [format #%02x%02x%02x $r $g $b]

A limited formatting of decimals to characters is available in other languages, e.g. CHR() in Basic. If you use that more often, here's a cute shortcut:

 interp alias {} chr {} format %c
 % set a [chr 49][chr 48]
 10

See Narrow formatting for short rendering of big integers, with powers of 1024:

 % fixform 12345678
 11.7M

This method should get format string and explain the format structure. This is a fast scatch:

 proc explainFormat {formatStr vars} {
 set index 1
 foreach frm [split $formatStr "%"] {
        set extra ""
        set size 0
        regexp {([0-9]+)([duioxXcsfegG])(.*)} $frm => size type extra
        if {$size==0} {
                set size [string length $frm]
        } else {
                set frm "%$size$type [lindex $vars 0]"
                set vars [lrange $vars 1 end]
                set size [string trimleft $size 0]
        }
        for {set i 0} {$i<2} {incr i} {
                set newIndex [expr {$size +$index -1}]
                puts "$index-$newIndex '$frm'"
                set index [expr {$newIndex +1}]
                if {$extra==""} {
                        break
                } else {
                        set frm $extra
                        set size [string length $extra]
                }
        }
 }
 }

 %explainFormat hello%02s000%3d $a $b
 1-5 'hello'
 6-7 '%02s $a'
 8-10 '000'
 11-13 '%3d $b'

Tcl syntax help - Arts and crafts of Tcl-Tk programming

Category Command - Category Binary Data - Category String Processing