[Python-3000] String formatting: Conversion specifiers
Talin
talin at acm.org
Tue Jun 6 20:07:09 CEST 2006
Nick Coghlan wrote:
> Talin wrote:
>
>> So I decided to sit down and rethink the whole conversion specifier
>> system. I looked at the docs for the '%' operator, and some other
>> languages, and here is what I came up with (this is an excerpt from
>> the revised PEP.)
>
>
> Generally nice, but I'd format the writeup a bit differently (see below)
> and reorder the elements so that an arbitrary character can be supplied
> as the fill character and the old ' ' sign flag behaviour remains
> available.
Looks good - thanks for the feedback.
My only comment is that I think that I would still like to have the sign
field before the width. I'm pretty sure that this can be parsed
unambiguously.
> I'd also design it so that the standard conversion specifiers are
> available 'for free' (i.e., they work for any class, unless the class
> author deliberately replaces them with something else).
>
> Cheers,
> Nick.
>
> --------------------------------
>
> Standard Conversion Specifiers
>
> If an object does not define its own conversion specifiers, a standard
> set of conversion specifiers are used. These are similar in concept to
> the conversion specifiers used by the existing '%' operator, however
> there are also a number of significant differences. The standard
> conversion specifiers fall into three major categories: string
> conversions, integer conversions and floating point conversions.
>
> The general form of a string conversion specifier is:
>
> [[fill][align]width][type]
>
> The brackets ([]) indicate an optional field.
>
> 'width' is a decimal integer defining the minimum field width.
> If not specified, then the field width will be determined by
> the content.
>
> If the minimum field width is defined, then the optional align
> flag can be one of the following:
>
> '<' - Forces the field to be left-aligned within the available
> space (This is the default.)
> '>' - Forces the field to be right-aligned within the
> available space.
>
> The optional 'fill' character defines the character to be used to
> pad the field to the minimum width. The alignment flag must be
> supplied if the character is a number other than 0 (otherwise the
> character would be interpreted as part of the field width specifier).
>
> Finally, the 'type' determines how the data should be presented.
>
> The available string conversion types are:
>
> 's' - String format. Invokes str() on the object.
> This is the default conversion specifier type.
> 'r' - Repr format. Invokes repr() on the object.
>
>
> The general form of an integer conversion specifier is:
>
> [[fill][align]width][sign]type
>
> The 'fill', 'align' and 'width' fields are as for string conversion
> specifiers.
>
> The 'sign' field can be one of the following:
>
> '+' - indicates that a sign should be used for both
> positive as well as negative numbers
> '-' - indicates that a sign should be used only for negative
> numbers (this is the default behaviour)
> ' ' - indicates that a leading space should be used on
> positive numbers
> '()' - indicates that negative numbers should be surrounded
> by parentheses
>
> There are several integer conversion types. All invoke int() on the
> object before attempting to format it.
>
> The available integer conversion types are:
>
> 'b' - Binary. Outputs the number in base 2.
> 'c' - Character. Converts the integer to the corresponding
> unicode character before printing.
> 'd' - Decimal Integer. Outputs the number in base 10.
> 'o' - Octal format. Outputs the number in base 8.
> 'x' - Hex format. Outputs the number in base 16, using lower-
> case letters for the digits above 9.
> 'X' - Hex format. Outputs the number in base 16, using upper-
> case letters for the digits above 9.
>
> The general form of a floating point conversion specifier is:
>
> [[fill][align]width][.precision][sign]type
>
> The 'fill', 'align', 'width' and 'sign' fields are as for
> integer conversion specifiers.
>
> The 'precision' field is a decimal number indicating how many digits
> should be displayed after the decimal point.
>
> There are several floating point conversion types. All invoke
> float() on
> the object before attempting to format it.
>
> The available floating point conversion types are:
>
> 'e' - Exponent notation. Prints the number in scientific
> notation using the letter 'e' to indicate the exponent.
> 'E' - Exponent notation. Same as 'e' except it uses an upper
> case 'E' as the separator character.
> 'f' - Fixed point. Displays the number as a fixed-point
> number.
> 'F' - Fixed point. Same as 'f'.
> 'g' - General format. This prints the number as a fixed-point
> number, unless the number is too large, in which case
> it switches to 'e' exponent notation.
> 'G' - General format. Same as 'g' except switches to 'E'
> if the number gets to large.
> 'n' - Number. This is the same as 'g', except that it uses the
> current locale setting to insert the appropriate
> number separator characters.
> '%' - Percentage. Multiplies the number by 100 and displays
> in fixed ('f') format, followed by a percent sign.
>
> Objects are able to define their own conversion specifiers to replace
> the standard ones. An example is the 'datetime' class, whose
> conversion specifiers might look something like the arguments
> to the strftime() function:
>
> "Today is: {0:a b d H:M:S Y}".format(datetime.now())
>
>
>
More information about the Python-3000
mailing list