Package org.apache.sis.measure
Class RangeFormat
java.lang.Object
java.text.Format
org.apache.sis.measure.RangeFormat
- All Implemented Interfaces:
Serializable,Cloneable,Localized
- Direct Known Subclasses:
SampleRangeFormat
Parses and formats
Range instances according the given locale.
This class complies to the format described in the ISO 31-11
standard, except that the minimal and maximal values are separated by the "…" character
instead of coma. More specifically, the format is defined as below:
- If the range is empty, then the range is represented by "
{}". - Otherwise if the minimal value is equal to the
maximal value, then that single value is formatted
inside braces as in "
{value}". - Otherwise the minimal and maximal values are formatted inside bracket or parenthesis,
depending on whether each endpoint is inclusive or exclusive:
- "
[min … max]" if both endpoints are inclusive (closed interval); - "
(min … max)" if both endpoints are exclusive (open interval); - or a mix of both styles if an endpoint is inclusive while the other is exclusive.
∞" symbol is used in place ofminormaxfor unbounded ranges. - "
MeasurementRange, then the
unit of measurement is appended except for empty ranges.
Lenient parsing
At parsing time, the above formatting rules are relaxed as below:- Empty ranges can be represented by "
[]"or "()" in addition to the standard "{}". - The braces are optional for singleton values, i.e. "
value" is accepted as well as "{value}".
Range type and type of range elements
The kind of ranges created by theparse(…) methods is determined
by the type of range elements:
- If the elements type is assignable to
Date, then theparse(…)methods will createRange<Date>objects. - If the elements type is assignable to
Number, then:- If the text to parse contains a unit of measurement, then
the
parse(…)methods will createMeasurementRangeobjects. - Otherwise the
parse(…)methods will createNumberRangeobjects.
- If the text to parse contains a unit of measurement, then
the
- Since:
- 0.3
- Version:
- 1.1
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final classConstants that are used as attribute keys in the iterator returned fromformatToCharacterIterator(Object). -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate booleantrueifRangeFormatshall use the alternate form at formatting time.private final intThe character closing a range in which the maximal value is exclusive.private final intAn alternative character closing a range in which the maximal value is exclusive.private final intThe character closing a range in which the maximal value is inclusive.private final intThe character closing an empty range or a range containing only one element.protected final FormatThe format to use for parsing and formatting the range components.protected final Class<?>The type of the range components.private final StringSymbols used by this format, inferred fromDecimalFormatSymbols.Whether we should insert a space between the bracket and the unit symbol.private LocaleThe locale for error message, ornullfor the default.private static final intThe constant value forFieldPositionwhich designate the maximal value.private static final intThe constant value forFieldPositionwhich designate the minimal value.private final charSymbols used by this format, inferred fromDecimalFormatSymbols.private final intThe character opening a range in which the minimal value is exclusive.private final intAn alternative character opening a range in which the minimal value is exclusive.private final intThe character opening a range in which the minimal value is inclusive.private final intThe character opening an empty range or a range containing only one element.private final StringThe string to use as a separator between minimal and maximal value, not including whitespaces.private static final longFor cross-version compatibility.private static final intThe constant value forFieldPositionwhich designate the unit of measurement.protected final UnitFormatThe format for unit of measurement, ornullif none. -
Constructor Summary
ConstructorsConstructorDescriptionCreates a new format for parsing and formatting number ranges using the default locale.RangeFormat(Locale locale) Creates a new format for parsing and formatting number ranges using the given locale.RangeFormat(Locale locale, Class<?> elementType) Creates a new format for parsing and formatting ranges of the given element type using the given locale.RangeFormat(Locale locale, TimeZone timezone) Creates a new format for parsing and formattingRange<Date>using the given locale and timezone. -
Method Summary
Modifier and TypeMethodDescriptionprivate static Range<?>Casts the given object to aRange, or throws anIllegalArgumentExceptionif the given object is not aRangeinstance.clone()Returns a clone of this range format.private ObjectConverts the given value to an instance of theelementTypetype.format(Object range, StringBuffer toAppendTo, FieldPosition pos) Formats aRangeand appends the resulting text to a given string buffer.private voidformat(Range<?> range, StringBuffer toAppendTo, FieldPosition pos, FormattedCharacterIterator characterIterator) Implementation of the format methods.formatToCharacterIterator(Object range) Formats a range as an attributed character iterator.getElementPattern(boolean localized) Returns the pattern used byelementFormatfor formatting the minimum and maximum values.private static intgetField(FieldPosition position) Returns the*_FIELDconstant for the given field position, or -1 if none.Returns this formatter locale.private booleaninsertSpaceBeforeUnit(javax.measure.Unit<?> unit) Returns whether we should insert a space between the bracket and the unit symbol.booleanReturnstrueif thisRangeFormatshall use the alternate form at formatting time.private booleanisClose(int c) Returnstrueif the given character is any of the closing bracket characters.private booleanisOpen(int c) Returnstrueif the given character is any of the opening bracket characters.Range<?>Parses text from the given string to produce a range.Range<?>parse(String source, ParsePosition pos) Parses text from a string to produce a range.parseObject(String source) Parses text from a string to produce a range.parseObject(String source, ParsePosition pos) Parses text from a string to produce a range.voidsetAlternateForm(boolean alternateForm) Sets whether thisRangeFormatshall use the alternate form at formatting time.voidsetElementPattern(String pattern, boolean localized) Sets the pattern to be used byelementFormatfor formatting the minimum and maximum values.private ObjecttoFormattable(Object value) Converts the given object to a type thatformat(…)method can process.private Range<?>tryParse(String source, ParsePosition pos) Tries to parse the given text.private ObjectReturns a "nil" value.
-
Field Details
-
serialVersionUID
private static final long serialVersionUIDFor cross-version compatibility.- See Also:
-
MIN_VALUE_FIELD
private static final int MIN_VALUE_FIELDThe constant value forFieldPositionwhich designate the minimal value. -
MAX_VALUE_FIELD
private static final int MAX_VALUE_FIELDThe constant value forFieldPositionwhich designate the maximal value. -
UNIT_FIELD
private static final int UNIT_FIELDThe constant value forFieldPositionwhich designate the unit of measurement.- See Also:
-
openSet
private final int openSetThe character opening an empty range or a range containing only one element. The default value is'{'. -
openInclusive
private final int openInclusiveThe character opening a range in which the minimal value is inclusive. The default value is'['. -
openExclusive
private final int openExclusiveThe character opening a range in which the minimal value is exclusive. The default value is'('. Note that the']'character is also sometimes used. -
openExclusiveAlt
private final int openExclusiveAltAn alternative character opening a range in which the minimal value is exclusive. This character is not used for formatting (onlyopenExclusiveis used), but is accepted during parsing. The default value is']'. -
closeSet
private final int closeSetThe character closing an empty range or a range containing only one element. The default value is'}'. -
closeInclusive
private final int closeInclusiveThe character closing a range in which the maximal value is inclusive. The default value is']'. -
closeExclusive
private final int closeExclusiveThe character closing a range in which the maximal value is exclusive. The default value is')'. Note that the'['character is also sometimes used. -
closeExclusiveAlt
private final int closeExclusiveAltAn alternative character closing a range in which the maximal value is exclusive. This character is not used for formatting (onlycloseExclusiveis used), but is accepted during parsing. The default value is'['. -
separator
The string to use as a separator between minimal and maximal value, not including whitespaces. The default value is"…"(Unicode 2026). -
minusSign
private final char minusSignSymbols used by this format, inferred fromDecimalFormatSymbols. -
infinity
Symbols used by this format, inferred fromDecimalFormatSymbols. -
alternateForm
private boolean alternateFormtrueifRangeFormatshall use the alternate form at formatting time. This flag as no effect on parsing, since both forms are accepted.- See Also:
-
elementType
The type of the range components. Valid types areNumber,Angle,Dateor a subclass of those types. This value determines the kind of range to be created by the parse method:- See Also:
-
elementFormat
The format to use for parsing and formatting the range components. The format is determined from the element type:AngleFormatif the element type is assignable toAngle.NumberFormatif the element type is assignable toNumber.DateFormatif the element type is assignable toDate.
-
unitFormat
The format for unit of measurement, ornullif none. This is non-null if and only ifelementTypeis assignable toNumberbut not toAngle. -
insertSpaceBeforeUnit
Whether we should insert a space between the bracket and the unit symbol.- See Also:
-
locale
The locale for error message, ornullfor the default.
-
-
Constructor Details
-
RangeFormat
public RangeFormat()Creates a new format for parsing and formatting number ranges using the default locale. -
RangeFormat
Creates a new format for parsing and formatting number ranges using the given locale.- Parameters:
locale- the locale for parsing and formatting range components.
-
RangeFormat
Creates a new format for parsing and formattingRange<Date>using the given locale and timezone.- Parameters:
locale- the locale for parsing and formatting range components.timezone- the timezone for the dates to be formatted.
-
RangeFormat
Creates a new format for parsing and formatting ranges of the given element type using the given locale. The element type is typicallyDate.classor some subclass ofNumber.class.- Parameters:
locale- the locale for parsing and formatting range components.elementType- the type of range components.- Throws:
IllegalArgumentException- if the given type is not recognized by this constructor.
-
-
Method Details
-
isOpen
private boolean isOpen(int c) Returnstrueif the given character is any of the opening bracket characters. -
isClose
private boolean isClose(int c) Returnstrueif the given character is any of the closing bracket characters. -
getLocale
Returns this formatter locale. This is the locale specified at construction time if any, or the default locale at construction time otherwise. -
getElementPattern
Returns the pattern used byelementFormatfor formatting the minimum and maximum values. If the element format does not use pattern, returnsnull.- Parameters:
localized-truefor returning the localized pattern, orfalsefor the unlocalized one.- Returns:
- the pattern, or
nullif theelementFormatdoesn't use pattern. - See Also:
-
setElementPattern
Sets the pattern to be used byelementFormatfor formatting the minimum and maximum values.- Parameters:
pattern- the new pattern.localized-trueif the given pattern is localized.- Throws:
IllegalStateException- if theelementFormatdoes not use pattern.- See Also:
-
isAlternateForm
public boolean isAlternateForm()Returnstrueif thisRangeFormatshall use the alternate form at formatting time. The alternate form expresses open intervals like]a…b[instead of(a…b).This flag has no effect on parsing, since the parser accepts both forms.
- Returns:
truefor using the alternate format instead of the default format.
-
setAlternateForm
public void setAlternateForm(boolean alternateForm) Sets whether thisRangeFormatshall use the alternate form at formatting time. The alternate form expresses open intervals like]a…b[instead of(a…b).- Parameters:
alternateForm-truefor using the alternate format, orfalsefor using the default format.
-
insertSpaceBeforeUnit
private boolean insertSpaceBeforeUnit(javax.measure.Unit<?> unit) Returns whether we should insert a space between the bracket and the unit symbol. We cache the result because checking for this condition forces us to format the unit symbol twice. -
getField
Returns the*_FIELDconstant for the given field position, or -1 if none. -
cast
Casts the given object to aRange, or throws anIllegalArgumentExceptionif the given object is not aRangeinstance. This is used for validating argument ofObjecttype in formatting methods.- Throws:
IllegalArgumentException
-
format
Formats aRangeand appends the resulting text to a given string buffer. See the class javadoc for a description of the format.- Specified by:
formatin classFormat- Parameters:
range- theRangeobject to format.toAppendTo- where the text is to be appended.pos- identifies a field in the formatted text, ornullif none.- Returns:
- the string buffer passed in as
toAppendTo, with formatted text appended. - Throws:
IllegalArgumentException- if this formatter cannot format the given object.
-
format
private void format(Range<?> range, StringBuffer toAppendTo, FieldPosition pos, FormattedCharacterIterator characterIterator) Implementation of the format methods.- Parameters:
range- the range to format.toAppendTo- where the text is to be appended.pos- identifies a field in the formatted text, ornullif none.characterIterator- the character iterator for which the attributes need to be set, or null if none.
-
formatToCharacterIterator
Formats a range as an attributed character iterator. Callers can iterate and queries the attribute values as in the following example: Alternatively, if the current iterator index is before the start of the minimum value field, then the starting position of that field can be obtained directly byit.getRunLimit(MIN_VALUE). If the current iterator index is inside the minimum value field, then the above method call will rather returns the end of that field. The same strategy works for other all fields too.The returned character iterator contains all
NumberFormat.Field,DateFormat.FieldorAngleFormat.Fieldattributes in addition to theRangeFormat.Fieldones. Consequently, the same character may have more than one attribute.In Apache SIS implementation, the returned character iterator also implements the
CharSequenceinterface for convenience.- Overrides:
formatToCharacterIteratorin classFormat- Parameters:
range- theRangeobject to format.- Returns:
- a character iterator together with the attributes describing the formatted value.
- Throws:
IllegalArgumentException- ifvalueif not an instance ofRange.
-
parseObject
Parses text from a string to produce a range. The default implementation delegates toparse(String)with no additional work.- Overrides:
parseObjectin classFormat- Parameters:
source- the text, part of which should be parsed.- Returns:
- a range parsed from the string.
- Throws:
ParseException- if the given string cannot be fully parsed.
-
parseObject
Parses text from a string to produce a range. The default implementation delegates toparse(String, ParsePosition)with no additional work.- Specified by:
parseObjectin classFormat- Parameters:
source- the text, part of which should be parsed.pos- index and error index information as described above.- Returns:
- a range parsed from the string, or
nullin case of error.
-
parse
Parses text from the given string to produce a range. This method use the full string. If there is some unparsed characters after the parsed range, then this method thrown an exception.- Parameters:
source- the text to parse.- Returns:
- the parsed range (never
null). - Throws:
ParseException- if the given string cannot be fully parsed.
-
parse
Parses text from a string to produce a range. The method attempts to parse text starting at the index given bypos. If parsing succeeds, then the index ofposis updated to the index after the last character used, and the parsed range is returned. If an error occurs, then the index ofposis not changed, the error index ofposis set to the index of the character where the error occurred, andnullis returned.- Parameters:
source- the text, part of which should be parsed.pos- index and error index information as described above.- Returns:
- a range parsed from the string, or
nullin case of error.
-
tryParse
Tries to parse the given text. In case of success, the error index is undetermined and need to be reset to -1. In case of failure (including an exception being thrown), the parse index is undetermined and need to be reset to its initial value.- Throws:
UnconvertibleObjectException
-
convert
Converts the given value to an instance of theelementTypetype. This method is partially the converse oftoFormattable(Object).- Throws:
UnconvertibleObjectException
-
toFormattable
Converts the given object to a type thatformat(…)method can process. This method is partially the converse ofconvert(Object). -
valueOfNil
Returns a "nil" value. This is used for creating empty ranges. -
clone
Returns a clone of this range format.
-