| 1 | '\" | 
|---|
| 2 | '\" Copyright (c) 1993 The Regents of the University of California. | 
|---|
| 3 | '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. | 
|---|
| 4 | '\" | 
|---|
| 5 | '\" See the file "license.terms" for information on usage and redistribution | 
|---|
| 6 | '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
| 7 | '\" | 
|---|
| 8 | '\" RCS: @(#) $Id: format.n,v 1.20 2007/12/13 15:22:32 dgp Exp $ | 
|---|
| 9 | '\" | 
|---|
| 10 | .so man.macros | 
|---|
| 11 | .TH format n 8.1 Tcl "Tcl Built-In Commands" | 
|---|
| 12 | .BS | 
|---|
| 13 | '\" Note:  do not modify the .SH NAME line immediately below! | 
|---|
| 14 | .SH NAME | 
|---|
| 15 | format \- Format a string in the style of sprintf | 
|---|
| 16 | .SH SYNOPSIS | 
|---|
| 17 | \fBformat \fIformatString \fR?\fIarg arg ...\fR? | 
|---|
| 18 | .BE | 
|---|
| 19 |  | 
|---|
| 20 | .SH INTRODUCTION | 
|---|
| 21 | .PP | 
|---|
| 22 | This command generates a formatted string in a fashion similar to the | 
|---|
| 23 | ANSI C \fBsprintf\fR procedure. | 
|---|
| 24 | \fIFormatString\fR indicates how to format the result, using | 
|---|
| 25 | \fB%\fR conversion specifiers as in \fBsprintf\fR, and the additional | 
|---|
| 26 | arguments, if any, provide values to be substituted into the result. | 
|---|
| 27 | The return value from \fBformat\fR is the formatted string. | 
|---|
| 28 | .SH "DETAILS ON FORMATTING" | 
|---|
| 29 | .PP | 
|---|
| 30 | The command operates by scanning \fIformatString\fR from left to right. | 
|---|
| 31 | Each character from the format string is appended to the result | 
|---|
| 32 | string unless it is a percent sign. | 
|---|
| 33 | If the character is a \fB%\fR then it is not copied to the result string. | 
|---|
| 34 | Instead, the characters following the \fB%\fR character are treated as | 
|---|
| 35 | a conversion specifier. | 
|---|
| 36 | The conversion specifier controls the conversion of the next successive | 
|---|
| 37 | \fIarg\fR to a particular format and the result is appended to | 
|---|
| 38 | the result string in place of the conversion specifier. | 
|---|
| 39 | If there are multiple conversion specifiers in the format string, | 
|---|
| 40 | then each one controls the conversion of one additional \fIarg\fR. | 
|---|
| 41 | The \fBformat\fR command must be given enough \fIarg\fRs to meet the needs | 
|---|
| 42 | of all of the conversion specifiers in \fIformatString\fR. | 
|---|
| 43 | .PP | 
|---|
| 44 | Each conversion specifier may contain up to six different parts: | 
|---|
| 45 | an XPG3 position specifier, | 
|---|
| 46 | a set of flags, a minimum field width, a precision, a size modifier, | 
|---|
| 47 | and a conversion character. | 
|---|
| 48 | Any of these fields may be omitted except for the conversion character. | 
|---|
| 49 | The fields that are present must appear in the order given above. | 
|---|
| 50 | The paragraphs below discuss each of these fields in turn. | 
|---|
| 51 | .PP | 
|---|
| 52 | If the \fB%\fR is followed by a decimal number and a \fB$\fR, as in | 
|---|
| 53 | .QW \fB%2$d\fR , | 
|---|
| 54 | then the value to convert is not taken from the next sequential argument. | 
|---|
| 55 | Instead, it is taken from the argument indicated by the number, | 
|---|
| 56 | where 1 corresponds to the first \fIarg\fR. | 
|---|
| 57 | If the conversion specifier requires multiple arguments because | 
|---|
| 58 | of \fB*\fR characters in the specifier then | 
|---|
| 59 | successive arguments are used, starting with the argument | 
|---|
| 60 | given by the number. | 
|---|
| 61 | This follows the XPG3 conventions for positional specifiers. | 
|---|
| 62 | If there are any positional specifiers in \fIformatString\fR | 
|---|
| 63 | then all of the specifiers must be positional. | 
|---|
| 64 | .PP | 
|---|
| 65 | The second portion of a conversion specifier may contain any of the | 
|---|
| 66 | following flag characters, in any order: | 
|---|
| 67 | .TP 10 | 
|---|
| 68 | \fB\-\fR | 
|---|
| 69 | Specifies that the converted argument should be left-justified | 
|---|
| 70 | in its field (numbers are normally right-justified with leading | 
|---|
| 71 | spaces if needed). | 
|---|
| 72 | .TP 10 | 
|---|
| 73 | \fB+\fR | 
|---|
| 74 | Specifies that a number should always be printed with a sign, | 
|---|
| 75 | even if positive. | 
|---|
| 76 | .TP 10 | 
|---|
| 77 | \fIspace\fR | 
|---|
| 78 | Specifies that a space should be added to the beginning of the | 
|---|
| 79 | number if the first character is not a sign. | 
|---|
| 80 | .TP 10 | 
|---|
| 81 | \fB0\fR | 
|---|
| 82 | Specifies that the number should be padded on the left with | 
|---|
| 83 | zeroes instead of spaces. | 
|---|
| 84 | .TP 10 | 
|---|
| 85 | \fB#\fR | 
|---|
| 86 | Requests an alternate output form. For \fBo\fR and \fBO\fR | 
|---|
| 87 | conversions it guarantees that the first digit is always \fB0\fR. | 
|---|
| 88 | For \fBx\fR or \fBX\fR conversions, \fB0x\fR or \fB0X\fR (respectively) | 
|---|
| 89 | will be added to the beginning of the result unless it is zero. | 
|---|
| 90 | For all floating-point conversions (\fBe\fR, \fBE\fR, \fBf\fR, | 
|---|
| 91 | \fBg\fR, and \fBG\fR) it guarantees that the result always | 
|---|
| 92 | has a decimal point. | 
|---|
| 93 | For \fBg\fR and \fBG\fR conversions it specifies that | 
|---|
| 94 | trailing zeroes should not be removed. | 
|---|
| 95 | .PP | 
|---|
| 96 | The third portion of a conversion specifier is a decimal number giving a | 
|---|
| 97 | minimum field width for this conversion. | 
|---|
| 98 | It is typically used to make columns line up in tabular printouts. | 
|---|
| 99 | If the converted argument contains fewer characters than the | 
|---|
| 100 | minimum field width then it will be padded so that it is as wide | 
|---|
| 101 | as the minimum field width. | 
|---|
| 102 | Padding normally occurs by adding extra spaces on the left of the | 
|---|
| 103 | converted argument, but the \fB0\fR and \fB\-\fR flags | 
|---|
| 104 | may be used to specify padding with zeroes on the left or with | 
|---|
| 105 | spaces on the right, respectively. | 
|---|
| 106 | If the minimum field width is specified as \fB*\fR rather than | 
|---|
| 107 | a number, then the next argument to the \fBformat\fR command | 
|---|
| 108 | determines the minimum field width; it must be an integer value. | 
|---|
| 109 | .PP | 
|---|
| 110 | The fourth portion of a conversion specifier is a precision, | 
|---|
| 111 | which consists of a period followed by a number. | 
|---|
| 112 | The number is used in different ways for different conversions. | 
|---|
| 113 | For \fBe\fR, \fBE\fR, and \fBf\fR conversions it specifies the number | 
|---|
| 114 | of digits to appear to the right of the decimal point. | 
|---|
| 115 | For \fBg\fR and \fBG\fR conversions it specifies the total number | 
|---|
| 116 | of digits to appear, including those on both sides of the decimal | 
|---|
| 117 | point (however, trailing zeroes after the decimal point will still | 
|---|
| 118 | be omitted unless the \fB#\fR flag has been specified). | 
|---|
| 119 | For integer conversions, it specifies a minimum number of digits | 
|---|
| 120 | to print (leading zeroes will be added if necessary). | 
|---|
| 121 | For \fBs\fR conversions it specifies the maximum number of characters to be | 
|---|
| 122 | printed; if the string is longer than this then the trailing characters will be dropped. | 
|---|
| 123 | If the precision is specified with \fB*\fR rather than a number | 
|---|
| 124 | then the next argument to the \fBformat\fR command determines the precision; | 
|---|
| 125 | it must be a numeric string. | 
|---|
| 126 | .PP | 
|---|
| 127 | The fifth part of a conversion specifier is a size modifier, | 
|---|
| 128 | which must be \fBll\fR, \fBh\fR, or \fBl\fR. | 
|---|
| 129 | If it is \fBll\fR it specifies that an integer value is taken | 
|---|
| 130 | without truncation for conversion to a formatted substring. | 
|---|
| 131 | If it is \fBh\fR it specifies that an integer value is | 
|---|
| 132 | truncated to a 16-bit range before converting.  This option is rarely useful. | 
|---|
| 133 | If it is \fBl\fR it specifies that the integer value is | 
|---|
| 134 | truncated to the same range as that produced by the \fBwide()\fR | 
|---|
| 135 | function of the \fBexpr\fR command (at least a 64-bit range). | 
|---|
| 136 | If neither \fBh\fR nor \fBl\fR are present, the integer value is | 
|---|
| 137 | truncated to the same range as that produced by the \fBint()\fR | 
|---|
| 138 | function of the \fBexpr\fR command (at least a 32-bit range, but | 
|---|
| 139 | determined by the value of \fBtcl_platform(wordSize)\fR). | 
|---|
| 140 | .PP | 
|---|
| 141 | The last thing in a conversion specifier is an alphabetic character | 
|---|
| 142 | that determines what kind of conversion to perform. | 
|---|
| 143 | The following conversion characters are currently supported: | 
|---|
| 144 | .TP 10 | 
|---|
| 145 | \fBd\fR | 
|---|
| 146 | Convert integer to signed decimal string. | 
|---|
| 147 | .TP 10 | 
|---|
| 148 | \fBu\fR | 
|---|
| 149 | Convert integer to unsigned decimal string. | 
|---|
| 150 | .TP 10 | 
|---|
| 151 | \fBi\fR | 
|---|
| 152 | Convert integer to signed decimal string (equivalent to \fBd\fR). | 
|---|
| 153 | .TP 10 | 
|---|
| 154 | \fBo\fR | 
|---|
| 155 | Convert integer to unsigned octal string. | 
|---|
| 156 | .TP 10 | 
|---|
| 157 | \fBx\fR or \fBX\fR | 
|---|
| 158 | Convert integer to unsigned hexadecimal string, using digits | 
|---|
| 159 | .QW 0123456789abcdef | 
|---|
| 160 | for \fBx\fR and | 
|---|
| 161 | .QW 0123456789ABCDEF | 
|---|
| 162 | for \fBX\fR). | 
|---|
| 163 | .TP 10 | 
|---|
| 164 | \fBc\fR | 
|---|
| 165 | Convert integer to the Unicode character it represents. | 
|---|
| 166 | .TP 10 | 
|---|
| 167 | \fBs\fR | 
|---|
| 168 | No conversion; just insert string. | 
|---|
| 169 | .TP 10 | 
|---|
| 170 | \fBf\fR | 
|---|
| 171 | Convert number to signed decimal string of | 
|---|
| 172 | the form \fIxx.yyy\fR, where the number of \fIy\fR's is determined by | 
|---|
| 173 | the precision (default: 6). | 
|---|
| 174 | If the precision is 0 then no decimal point is output. | 
|---|
| 175 | .TP 10 | 
|---|
| 176 | \fBe\fR or \fBE\fR | 
|---|
| 177 | Convert number to scientific notation in the | 
|---|
| 178 | form \fIx.yyy\fBe\(+-\fIzz\fR, where the number of \fIy\fR's is determined | 
|---|
| 179 | by the precision (default: 6). | 
|---|
| 180 | If the precision is 0 then no decimal point is output. | 
|---|
| 181 | If the \fBE\fR form is used then \fBE\fR is | 
|---|
| 182 | printed instead of \fBe\fR. | 
|---|
| 183 | .TP 10 | 
|---|
| 184 | \fBg\fR or \fBG\fR | 
|---|
| 185 | If the exponent is less than \-4 or greater than or equal to the | 
|---|
| 186 | precision, then convert number as for \fB%e\fR or | 
|---|
| 187 | \fB%E\fR. | 
|---|
| 188 | Otherwise convert as for \fB%f\fR. | 
|---|
| 189 | Trailing zeroes and a trailing decimal point are omitted. | 
|---|
| 190 | .TP 10 | 
|---|
| 191 | \fB%\fR | 
|---|
| 192 | No conversion: just insert \fB%\fR. | 
|---|
| 193 | .SH "DIFFERENCES FROM ANSI SPRINTF" | 
|---|
| 194 | .PP | 
|---|
| 195 | The behavior of the format command is the same as the | 
|---|
| 196 | ANSI C \fBsprintf\fR procedure except for the following | 
|---|
| 197 | differences: | 
|---|
| 198 | .IP [1] | 
|---|
| 199 | \fB%p\fR and \fB%n\fR specifiers are not supported. | 
|---|
| 200 | .IP [2] | 
|---|
| 201 | For \fB%c\fR conversions the argument must be an integer value, | 
|---|
| 202 | which will then be converted to the corresponding character value. | 
|---|
| 203 | .IP [3] | 
|---|
| 204 | The size modifiers are ignored when formatting floating-point values. | 
|---|
| 205 | The \fBll\fR modifier has no \fBsprintf\fR counterpart. | 
|---|
| 206 | .SH EXAMPLES | 
|---|
| 207 | Convert the numeric value of a UNICODE character to the character | 
|---|
| 208 | itself: | 
|---|
| 209 | .CS | 
|---|
| 210 | set value 120 | 
|---|
| 211 | set char [\fBformat\fR %c $value] | 
|---|
| 212 | .CE | 
|---|
| 213 | .PP | 
|---|
| 214 | Convert the output of \fBtime\fR into seconds to an accuracy of | 
|---|
| 215 | hundredths of a second: | 
|---|
| 216 | .CS | 
|---|
| 217 | set us [lindex [time $someTclCode] 0] | 
|---|
| 218 | puts [\fBformat\fR "%.2f seconds to execute" [expr {$us / 1e6}]] | 
|---|
| 219 | .CE | 
|---|
| 220 | .PP | 
|---|
| 221 | Create a packed X11 literal color specification: | 
|---|
| 222 | .CS | 
|---|
| 223 | # Each color-component should be in range (0..255) | 
|---|
| 224 | set color [\fBformat\fR "#%02x%02x%02x" $r $g $b] | 
|---|
| 225 | .CE | 
|---|
| 226 | .PP | 
|---|
| 227 | Use XPG3 format codes to allow reordering of fields (a technique that | 
|---|
| 228 | is often used in localized message catalogs; see \fBmsgcat\fR) without | 
|---|
| 229 | reordering the data values passed to \fBformat\fR: | 
|---|
| 230 | .CS | 
|---|
| 231 | set fmt1 "Today, %d shares in %s were bought at $%.2f each" | 
|---|
| 232 | puts [\fBformat\fR $fmt1 123 "Global BigCorp" 19.37] | 
|---|
| 233 |  | 
|---|
| 234 | set fmt2 "Bought %2\e$s equity ($%3$.2f x %1\e$d) today" | 
|---|
| 235 | puts [\fBformat\fR $fmt2 123 "Global BigCorp" 19.37] | 
|---|
| 236 | .CE | 
|---|
| 237 | .PP | 
|---|
| 238 | Print a small table of powers of three: | 
|---|
| 239 | .CS | 
|---|
| 240 | # Set up the column widths | 
|---|
| 241 | set w1 5 | 
|---|
| 242 | set w2 10 | 
|---|
| 243 |  | 
|---|
| 244 | # Make a nice header (with separator) for the table first | 
|---|
| 245 | set sep +-[string repeat - $w1]-+-[string repeat - $w2]-+ | 
|---|
| 246 | puts $sep | 
|---|
| 247 | puts [\fBformat\fR "| %-*s | %-*s |" $w1 "Index" $w2 "Power"] | 
|---|
| 248 | puts $sep | 
|---|
| 249 |  | 
|---|
| 250 | # Print the contents of the table | 
|---|
| 251 | set p 1 | 
|---|
| 252 | for {set i 0} {$i<=20} {incr i} { | 
|---|
| 253 | puts [\fBformat\fR "| %*d | %*ld |" $w1 $i $w2 $p] | 
|---|
| 254 | set p [expr {wide($p) * 3}] | 
|---|
| 255 | } | 
|---|
| 256 |  | 
|---|
| 257 | # Finish off by printing the separator again | 
|---|
| 258 | puts $sep | 
|---|
| 259 | .CE | 
|---|
| 260 | .SH "SEE ALSO" | 
|---|
| 261 | scan(n), sprintf(3), string(n) | 
|---|
| 262 | .SH KEYWORDS | 
|---|
| 263 | conversion specifier, format, sprintf, string, substitution | 
|---|