Package org.python.core.stringlib
Class InternalFormat.Formatter
- java.lang.Object
-
- org.python.core.stringlib.InternalFormat.Formatter
-
- All Implemented Interfaces:
java.lang.Appendable
- Direct Known Subclasses:
FloatFormatter,IntegerFormatter,TextFormatter
- Enclosing class:
- InternalFormat
public static class InternalFormat.Formatter extends java.lang.Object implements java.lang.AppendableA class that provides the base for implementations of type-specific formatting. In a limited way, it acts like a StringBuilder to which text and one or more numbers may be appended, formatted according to the format specifier supplied at construction. These are ephemeral objects that are not, on their own, thread safe.
-
-
Constructor Summary
Constructors Constructor Description Formatter(java.lang.StringBuilder result, InternalFormat.Spec spec)Construct the formatter from a client-supplied buffer and a specification.Formatter(InternalFormat.Spec spec, int width)Construct the formatter from a specification and initial buffer capacity.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static PyExceptionalignmentNotAllowed(char align, java.lang.String forType)Convenience method returning aPy.ValueErrorreporting that the given alignment flag is not allowed in a format specifier for the named type.static PyExceptionalternateFormNotAllowed(java.lang.String forType)Convenience method returning aPy.ValueErrorreporting that alternate form is not allowed in a format specifier for the named type.static PyExceptionalternateFormNotAllowed(java.lang.String forType, char code)Convenience method returning aPy.ValueErrorreporting that alternate form is not allowed in a format specifier for the named type and specified typoe code.InternalFormat.Formatterappend(char c)InternalFormat.Formatterappend(java.lang.CharSequence csq)InternalFormat.Formatterappend(java.lang.CharSequence csq, int start, int end)PyStringgetPyResult()java.lang.StringgetResult()Current (possibly final) result of the formatting, as aString.booleanisBytes()Whether initialised for a byte-like interpretation.static PyExceptionnotAllowed(java.lang.String outrage, java.lang.String forType)Convenience method returning aPy.ValueErrorreporting that some format specifier feature is not allowed for the named data type.static PyExceptionnotAllowed(java.lang.String outrage, java.lang.String forType, char code)Convenience method returning aPy.ValueErrorreporting that some format specifier feature is not allowed for the named format code and data type.InternalFormat.Formatterpad()static PyExceptionprecisionNotAllowed(java.lang.String forType)Convenience method returning aPy.ValueErrorreporting that specifying a precision is not allowed in a format specifier for the named type.static PyExceptionprecisionTooLarge(java.lang.String type)Convenience method returning aPy.OverflowErrorreporting:voidsetBytes(boolean bytes)Signals the client's intention to make a PyString (or other byte-like) interpretation ofresult, rather than a PyUnicode one.voidsetStart()static PyExceptionsignNotAllowed(java.lang.String forType, char code)Convenience method returning aPy.ValueErrorreporting that specifying a sign is not allowed in a format specifier for the named type.java.lang.StringtoString()static PyExceptionunknownFormat(char code, java.lang.String forType)Convenience method returning aPy.ValueErrorreporting:static PyExceptionzeroPaddingNotAllowed(java.lang.String forType)Convenience method returning aPy.ValueErrorreporting that zero padding is not allowed in a format specifier for the named type.
-
-
-
Constructor Detail
-
Formatter
public Formatter(java.lang.StringBuilder result, InternalFormat.Spec spec)Construct the formatter from a client-supplied buffer and a specification. Setsmarkandstartto the end of the buffer. The new formatted object will therefore be appended there and, when the time comes, padding will be applied to (just) the new text.- Parameters:
result- destination bufferspec- parsed conversion specification
-
Formatter
public Formatter(InternalFormat.Spec spec, int width)
Construct the formatter from a specification and initial buffer capacity. Setsmarkto the end of the buffer.- Parameters:
spec- parsed conversion specificationwidth- of buffer initially
-
-
Method Detail
-
setBytes
public void setBytes(boolean bytes)
Signals the client's intention to make a PyString (or other byte-like) interpretation ofresult, rather than a PyUnicode one. Only formatters that could produce characters >255 are affected by this (e.g. c-format). Idiom:MyFormatter f = new MyFormatter( InternalFormatter.fromText(formatSpec) ); f.setBytes(!(formatSpec instanceof PyUnicode)); // ... formatting work return f.getPyResult();
- Parameters:
bytes- true to signal the intention to make a byte-like interpretation
-
isBytes
public boolean isBytes()
Whether initialised for a byte-like interpretation.- Returns:
- bytes attribute
-
getResult
public java.lang.String getResult()
Current (possibly final) result of the formatting, as aString.- Returns:
- formatted result
-
getPyResult
public PyString getPyResult()
Convenience method to return the current result of the formatting, as aPyObject, eitherPyStringorPyUnicodeaccording tobytes.- Returns:
- formatted result
-
append
public InternalFormat.Formatter append(char c)
- Specified by:
appendin interfacejava.lang.Appendable
-
append
public InternalFormat.Formatter append(java.lang.CharSequence csq)
- Specified by:
appendin interfacejava.lang.Appendable
-
append
public InternalFormat.Formatter append(java.lang.CharSequence csq, int start, int end) throws java.lang.IndexOutOfBoundsException
- Specified by:
appendin interfacejava.lang.Appendable- Throws:
java.lang.IndexOutOfBoundsException
-
setStart
public void setStart()
Clear the instance variables describing the latest object inresult, ready to receive a new one: setsstartand callsreset(). This is necessary when aFormatteris to be re-used. Note that this leavesmarkwhere it is. In the core, we need this to supportcomplex: two floats in the same format, but padded as a unit.
-
toString
public java.lang.String toString()
Overridden to provide a debugging view in which the actual text is shown divided up by the
len*member variables. If the dividers don't look right, those variables have not remained consistent with the text.- Overrides:
toStringin classjava.lang.Object
-
pad
public InternalFormat.Formatter pad()
Pad the result so far (defined as the contents ofresultfrommarkto the end) using the alignment, target width and fill character defined inspec. The action of padding will increase the length of this segment to the target width, if that is greater than the current length.When the padding method has decided that that it needs to add n padding characters, it will affect
startorlenWholeas follows.
Note that in the "pad after sign" mode, only the last number into the buffer receives the padding. This padding gets incorporated into the whole part of the number. (In other modes, the padding is aroundalign meaning start lenWhole result.length() < left-aligned +0 +0 +n > right-aligned +n +0 +n ^ centred +(n/2) +0 +n = pad after sign +0 +n +n result[mark:].) When this would not be appropriate, it is up to the client to disallow this (whichcomplexdoes).- Returns:
- this Formatter object
-
unknownFormat
public static PyException unknownFormat(char code, java.lang.String forType)
Convenience method returning aPy.ValueErrorreporting:"Unknown format code '"+code+"' for object of type '"+forType+"'"- Parameters:
code- the presentation typeforType- the type it was found applied to- Returns:
- exception to throw
-
alternateFormNotAllowed
public static PyException alternateFormNotAllowed(java.lang.String forType)
Convenience method returning aPy.ValueErrorreporting that alternate form is not allowed in a format specifier for the named type.- Parameters:
forType- the type it was found applied to- Returns:
- exception to throw
-
alternateFormNotAllowed
public static PyException alternateFormNotAllowed(java.lang.String forType, char code)
Convenience method returning aPy.ValueErrorreporting that alternate form is not allowed in a format specifier for the named type and specified typoe code.- Parameters:
forType- the type it was found applied tocode- the formatting code (or '\0' not to mention one)- Returns:
- exception to throw
-
alignmentNotAllowed
public static PyException alignmentNotAllowed(char align, java.lang.String forType)
Convenience method returning aPy.ValueErrorreporting that the given alignment flag is not allowed in a format specifier for the named type.- Parameters:
align- type of alignmentforType- the type it was found applied to- Returns:
- exception to throw
-
signNotAllowed
public static PyException signNotAllowed(java.lang.String forType, char code)
Convenience method returning aPy.ValueErrorreporting that specifying a sign is not allowed in a format specifier for the named type.- Parameters:
forType- the type it was found applied tocode- the formatting code (or '\0' not to mention one)- Returns:
- exception to throw
-
precisionNotAllowed
public static PyException precisionNotAllowed(java.lang.String forType)
Convenience method returning aPy.ValueErrorreporting that specifying a precision is not allowed in a format specifier for the named type.- Parameters:
forType- the type it was found applied to- Returns:
- exception to throw
-
zeroPaddingNotAllowed
public static PyException zeroPaddingNotAllowed(java.lang.String forType)
Convenience method returning aPy.ValueErrorreporting that zero padding is not allowed in a format specifier for the named type.- Parameters:
forType- the type it was found applied to- Returns:
- exception to throw
-
notAllowed
public static PyException notAllowed(java.lang.String outrage, java.lang.String forType)
Convenience method returning aPy.ValueErrorreporting that some format specifier feature is not allowed for the named data type.- Parameters:
outrage- committed in the present caseforType- the data type (e.g. "integer") it where it is an outrage- Returns:
- exception to throw
-
notAllowed
public static PyException notAllowed(java.lang.String outrage, java.lang.String forType, char code)
Convenience method returning aPy.ValueErrorreporting that some format specifier feature is not allowed for the named format code and data type. Produces a message like:outrage+" not allowed with "+forType+" format specifier '"+code+"'"outrage+" not allowed in "+forType+" format specifier"- Parameters:
outrage- committed in the present caseforType- the data type (e.g. "integer") it where it is an outragecode- the formatting code for which it is an outrage (or '\0' not to mention one)- Returns:
- exception to throw
-
precisionTooLarge
public static PyException precisionTooLarge(java.lang.String type)
Convenience method returning aPy.OverflowErrorreporting:"formatted "+type+" is too long (precision too large?)"- Parameters:
type- of formatting ("integer", "float")- Returns:
- exception to throw
-
-