Movatterモバイル変換


[0]ホーム

URL:


base-4.12.0.0: Basic libraries

Copyright(c) Lennart Augustsson and Bart Massey 2013
LicenseBSD-style (see the file LICENSE in this distribution)
MaintainerBart Massey <bart@cs.pdx.edu>
Stabilityprovisional
Portabilityportable
Safe HaskellSafe
LanguageHaskell2010

Text.Printf

Contents

Description

A Cprintf(3)-like formatter. This version has been extended by Bart Massey as per the recommendations of John Meacham and Simon Marlow <http://comments.gmane.org/gmane.comp.lang.haskell.libraries/4726> to support extensible formatting for new datatypes. It has also been extended to support almost all Cprintf(3) syntax.

Synopsis

Printing Functions

printf ::PrintfType r =>String -> rSource#

Format a variable number of arguments with the C-style formatting string.

>>>printf "%s, %d, %.4f" "hello" 123 pihello, 123, 3.1416

The return value is eitherString or(IO a) (which should be(IO '()'), but Haskell's type system makes this hard).

The format string consists of ordinary characters andconversion specifications, which specify how to format one of the arguments toprintf in the output string. A format specification is introduced by the% character; this character can be self-escaped into the format string using%%. A format specification ends with a /format character/ that provides the primary information about how to format the value. The rest of the conversion specification is optional. In order, one may have flag characters, a width specifier, a precision specifier, and type-specific modifier characters.

Unlike Cprintf(3), the formatting of thisprintf is driven by the argument type; formatting is type specific. The types formatted byprintf "out of the box" are:

printf is also extensible to support other types: see below.

A conversion specification begins with the character%, followed by zero or more of the following flags:

-      left adjust (default is right adjust)+      always use a sign (+ or -) for signed conversionsspace  leading space for positive numbers in signed conversions0      pad with zeros rather than spaces#      use an \"alternate form\": see below

When both flags are given,- overrides0 and+ overrides space. A negative width specifier in a* conversion is treated as positive but implies the left adjust flag.

The "alternate form" for unsigned radix conversions is as in Cprintf(3):

%o           prefix with a leading 0 if needed%x           prefix with a leading 0x if nonzero%X           prefix with a leading 0X if nonzero%b           prefix with a leading 0b if nonzero%[eEfFgG]    ensure that the number contains a decimal point

Any flags are followed optionally by a field width:

num    field width*      as num, but taken from argument list

The field width is a minimum, not a maximum: it will be expanded as needed to avoid mutilating a value.

Any field width is followed optionally by a precision:

.num   precision.      same as .0.*     as num, but taken from argument list

Negative precision is taken as 0. The meaning of the precision depends on the conversion type.

Integral    minimum number of digits to showRealFloat   number of digits after the decimal pointString      maximum number of characters

The precision for Integral types is accomplished by zero-padding. If both precision and zero-pad are given for an Integral field, the zero-pad is ignored.

Any precision is followed optionally for Integral types by a width modifier; the only use of this modifier being to set the implicit size of the operand for conversion of a negative operand to unsigned:

hh     Int8h      Int16l      Int32ll     Int64L      Int64

The specification ends with a format character:

c      character               Integrald      decimal                 Integralo      octal                   Integralx      hexadecimal             IntegralX      hexadecimal             Integralb      binary                  Integralu      unsigned decimal        Integralf      floating point          RealFloatF      floating point          RealFloatg      general format float    RealFloatG      general format float    RealFloate      exponent format float   RealFloatE      exponent format float   RealFloats      string                  Stringv      default format          any type

The "%v" specifier is provided for all built-in types, and should be provided for user-defined type formatters as well. It picks a "best" representation for the given type. For the built-in types the "%v" specifier is converted as follows:

c      Charu      other unsigned Integrald      other signed Integralg      RealFloats      String

Mismatch between the argument types and the format string, as well as any other syntactic or semantic errors in the format string, will cause an exception to be thrown at runtime.

Note that the formatting forRealFloat types is currently a bit different from that of Cprintf(3), conforming instead toshowEFloat,showFFloat andshowGFloat (and their alternate versionsshowFFloatAlt andshowGFloatAlt). This is hard to fix: the fixed versions would format in a backward-incompatible way. In any case the Haskell behavior is generally more sensible than the C behavior. A brief summary of some key differences:

  • Haskellprintf never uses the default "6-digit" precision used by C printf.
  • Haskellprintf treats the "precision" specifier as indicating the number of digits after the decimal point.
  • Haskellprintf prints the exponent of e-format numbers without a gratuitous plus sign, and with the minimum possible number of digits.
  • Haskellprintf will place a zero after a decimal point when possible.

hPrintf ::HPrintfType r =>Handle ->String -> rSource#

Similar toprintf, except that output is via the specifiedHandle. The return type is restricted to(IO a).

Extending To New Types

Thisprintf can be extended to format types other than those provided for by default. This is done by instantiatingPrintfArg and providing aformatArg for the type. It is possible to provide aparseFormat to process type-specific modifiers, but the default instance is usually the best choice.

For example:

instance PrintfArg () where  formatArg x fmt | fmtChar (vFmt 'U' fmt) == 'U' =    formatString "()" (fmt { fmtChar = 's', fmtPrecision = Nothing })  formatArg _ fmt = errorBadFormat $ fmtChar fmtmain :: IO ()main = printf "[%-3.1U]\n" ()

prints "[() ]". Note the use offormatString to take care of field formatting specifications in a convenient way.

classPrintfArg awhereSource#

Typeclass ofprintf-formattable values. TheformatArg method takes a value and a field format descriptor and either fails due to a bad descriptor or produces aShowS as the result. The defaultparseFormat expects no modifiers: this is the normal case. Minimal instance:formatArg.

Minimal complete definition

formatArg

Methods

formatArg :: a ->FieldFormatterSource#

Since: 4.7.0.0

parseFormat :: a ->ModifierParserSource#

Since: 4.7.0.0

Instances
PrintfArgCharSource#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgDoubleSource#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgFloatSource#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgIntSource#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgInt8Source#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgInt16Source#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgInt32Source#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgInt64Source#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgIntegerSource#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgNaturalSource#

Since: 4.8.0.0

Instance details

Defined inText.Printf

PrintfArgWordSource#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgWord8Source#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgWord16Source#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgWord32Source#

Since: 2.1

Instance details

Defined inText.Printf

PrintfArgWord64Source#

Since: 2.1

Instance details

Defined inText.Printf

IsChar c =>PrintfArg [c]Source#

Since: 2.1

Instance details

Defined inText.Printf

typeFieldFormatter =FieldFormat ->ShowSSource#

This is the type of a field formatter reified over its argument.

Since: 4.7.0.0

dataFieldFormatSource#

Description of field formatting forformatArg. See UNIXprintf(3) for a description of how field formatting works.

Since: 4.7.0.0

Constructors

FieldFormat 

Fields

dataFormatAdjustmentSource#

Whether to left-adjust or zero-pad a field. These are mutually exclusive, withLeftAdjust taking precedence.

Since: 4.7.0.0

Constructors

LeftAdjust 
ZeroPad 

dataFormatSignSource#

How to handle the sign of a numeric field. These are mutually exclusive, withSignPlus taking precedence.

Since: 4.7.0.0

Constructors

SignPlus 
SignSpace 

vFmt ::Char ->FieldFormat ->FieldFormatSource#

Substitute a 'v' format character with the given default format character in theFieldFormat. A convenience for user-implemented types, which should support "%v".

Since: 4.7.0.0

Handling Type-specific Modifiers

In the unlikely case that modifier characters of some kind are desirable for a user-provided type, aModifierParser can be provided to process these characters. The resulting modifiers will appear in theFieldFormat for use by the type-specific formatter.

typeModifierParser =String ->FormatParseSource#

Type of a function that will parse modifier characters from the format string.

Since: 4.7.0.0

dataFormatParseSource#

The "format parser" walks over argument-type-specific modifier characters to find the primary format character. This is the type of its result.

Since: 4.7.0.0

Constructors

FormatParse 

Fields

Standard Formatters

These formatters for standard types are provided for convenience in writting new type-specific formatters: a common pattern is to throw toformatString orformatInteger to do most of the format handling for a new type.

formatString ::IsChar a => [a] ->FieldFormatterSource#

Formatter forString values.

Since: 4.7.0.0

formatChar ::Char ->FieldFormatterSource#

Formatter forChar values.

Since: 4.7.0.0

formatInt :: (Integral a,Bounded a) => a ->FieldFormatterSource#

Formatter forInt values.

Since: 4.7.0.0

formatInteger ::Integer ->FieldFormatterSource#

Formatter forInteger values.

Since: 4.7.0.0

formatRealFloat ::RealFloat a => a ->FieldFormatterSource#

Formatter forRealFloat values.

Since: 4.7.0.0

Raising Errors

These functions are used internally to raise various errors, and are exported for use by new type-specific formatters.

errorBadFormat ::Char -> aSource#

Callsperror to indicate an unknown format letter for a given type.

Since: 4.7.0.0

errorShortFormat :: aSource#

Callsperror to indicate that the format string ended early.

Since: 4.7.0.0

errorMissingArgument :: aSource#

Callsperror to indicate that there is a missing argument in the argument list.

Since: 4.7.0.0

errorBadArgument :: aSource#

Callsperror to indicate that there is a type error or similar in the given argument.

Since: 4.7.0.0

perror ::String -> aSource#

Raises anerror with a printf-specific prefix on the message string.

Since: 4.7.0.0

Implementation Internals

These types are needed for implementing processing variable numbers of arguments toprintf andhPrintf. Their implementation is intentionally not visible from this module. If you attempt to pass an argument of a type which is not an instance of the appropriate class toprintf orhPrintf, then the compiler will report it as a missing instance ofPrintfArg. (AllPrintfArg instances arePrintfType instances.)

classPrintfType tSource#

ThePrintfType class provides the variable argument magic forprintf. Its implementation is intentionally not visible from this module. If you attempt to pass an argument of a type which is not an instance of this class toprintf orhPrintf, then the compiler will report it as a missing instance ofPrintfArg.

Minimal complete definition

spr

Instances
IsChar c =>PrintfType [c]Source#

Since: 2.1

Instance details

Defined inText.Printf

Methods

spr ::String -> [UPrintf] -> [c]

a ~ () =>PrintfType (IO a)Source#

Since: 4.7.0.0

Instance details

Defined inText.Printf

Methods

spr ::String -> [UPrintf] ->IO a

(PrintfArg a,PrintfType r) =>PrintfType (a -> r)Source#

Since: 2.1

Instance details

Defined inText.Printf

Methods

spr ::String -> [UPrintf] -> a -> r

classHPrintfType tSource#

TheHPrintfType class provides the variable argument magic forhPrintf. Its implementation is intentionally not visible from this module.

Minimal complete definition

hspr

Instances
a ~ () =>HPrintfType (IO a)Source#

Since: 4.7.0.0

Instance details

Defined inText.Printf

Methods

hspr ::Handle ->String -> [UPrintf] ->IO a

(PrintfArg a,HPrintfType r) =>HPrintfType (a -> r)Source#

Since: 2.1

Instance details

Defined inText.Printf

Methods

hspr ::Handle ->String -> [UPrintf] -> a -> r

This class is needed as a Haskell98 compatibility workaround for the lack of FlexibleInstances.

classIsChar cwhereSource#

This class, with only the one instance, is used as a workaround for the fact thatString, as a concrete type, is not allowable as a typeclass instance.IsChar is exported for backward-compatibility.

Methods

toChar :: c ->CharSource#

Since: 4.7.0.0

fromChar ::Char -> cSource#

Since: 4.7.0.0

Instances
IsCharCharSource#

Since: 2.1

Instance details

Defined inText.Printf

Produced byHaddock version 2.20.0


[8]ページ先頭

©2009-2025 Movatter.jp