Class MutablePatternModifier
- java.lang.Object
-
- com.ibm.icu.impl.number.MutablePatternModifier
-
- All Implemented Interfaces:
AffixUtils.SymbolProvider
,MicroPropsGenerator
,Modifier
public class MutablePatternModifier extends java.lang.Object implements Modifier, AffixUtils.SymbolProvider, MicroPropsGenerator
This class is aModifier
that wraps a decimal format pattern. It applies the pattern's affixes inModifier.apply(com.ibm.icu.impl.FormattedStringBuilder, int, int)
.In addition to being a Modifier, this class contains the business logic for substituting the correct locale symbols into the affixes of the decimal format pattern.
In order to use this class, create a new instance and call the following four setters:
setPatternInfo(com.ibm.icu.impl.number.AffixPatternProvider, com.ibm.icu.text.NumberFormat.Field)
,setPatternAttributes(com.ibm.icu.number.NumberFormatter.SignDisplay, boolean, boolean)
,setSymbols(com.ibm.icu.text.DecimalFormatSymbols, com.ibm.icu.util.Currency, com.ibm.icu.number.NumberFormatter.UnitWidth, com.ibm.icu.text.PluralRules)
, andsetNumberProperties(com.ibm.icu.impl.number.Modifier.Signum, com.ibm.icu.impl.StandardPlural)
. After calling these four setters, the instance will be ready for use as a Modifier.This is a MUTABLE, NON-THREAD-SAFE class designed for performance. Do NOT save references to this or attempt to use it from multiple threads! Instead, you can obtain a safe, immutable decimal format pattern modifier by calling
createImmutable()
, in effect treating this instance as a builder for the immutable variant.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
MutablePatternModifier.ImmutablePatternModifier
-
Nested classes/interfaces inherited from interface com.ibm.icu.impl.number.Modifier
Modifier.Parameters, Modifier.Signum
-
-
Field Summary
Fields Modifier and Type Field Description (package private) boolean
approximately
(package private) Currency
currency
(package private) java.lang.StringBuilder
currentAffix
(package private) NumberFormat.Field
field
(package private) boolean
isStrong
(package private) MicroPropsGenerator
parent
(package private) AffixPatternProvider
patternInfo
(package private) boolean
perMilleReplacesPercent
(package private) StandardPlural
plural
(package private) PluralRules
rules
(package private) NumberFormatter.SignDisplay
signDisplay
(package private) Modifier.Signum
signum
(package private) DecimalFormatSymbols
symbols
(package private) NumberFormatter.UnitWidth
unitWidth
-
Constructor Summary
Constructors Constructor Description MutablePatternModifier(boolean isStrong)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description MicroPropsGenerator
addToChain(MicroPropsGenerator parent)
Used by the unsafe code path.int
apply(FormattedStringBuilder output, int leftIndex, int rightIndex)
Apply this Modifier to the string builder.boolean
containsField(java.text.Format.Field field)
Whether the modifier contains at least one occurrence of the given field.private ConstantMultiFieldModifier
createConstantModifier(FormattedStringBuilder a, FormattedStringBuilder b)
Uses the current properties to create a singleConstantMultiFieldModifier
with currency spacing support if required.MutablePatternModifier.ImmutablePatternModifier
createImmutable()
Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable and can be saved for future use.int
getCodePointCount()
Returns the number of code points in the modifier, prefix plus suffix.java.lang.String
getCurrencySymbolForUnitWidth()
Returns the currency symbol for the unit width specified in setSymbols()Modifier.Parameters
getParameters()
Gets a set of "parameters" for this Modifier.int
getPrefixLength()
Gets the length of the prefix.java.lang.CharSequence
getSymbol(int type)
Returns the string that substitutes a given symbol type in a pattern.private int
insertPrefix(FormattedStringBuilder sb, int position)
private int
insertSuffix(FormattedStringBuilder sb, int position)
boolean
isStrong()
Whether this modifier is strong.boolean
needsPlurals()
Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize.private void
prepareAffix(boolean isPrefix)
Pre-processes the prefix or suffix into the currentAffix field, creating and mutating that field if necessary.MicroProps
processQuantity(DecimalQuantity fq)
Considers the givenDecimalQuantity
, optionally mutates it, and returns aMicroProps
.void
setNumberProperties(Modifier.Signum signum, StandardPlural plural)
Sets attributes of the current number being processed.void
setPatternAttributes(NumberFormatter.SignDisplay signDisplay, boolean perMille, boolean approximately)
Sets attributes that imply changes to the literal interpretation of the pattern string affixes.void
setPatternInfo(AffixPatternProvider patternInfo, NumberFormat.Field field)
Sets a reference to the parsed decimal format pattern, usually obtained fromPatternStringParser.parseToPatternInfo(String)
, but any implementation ofAffixPatternProvider
is accepted.void
setSymbols(DecimalFormatSymbols symbols, Currency currency, NumberFormatter.UnitWidth unitWidth, PluralRules rules)
Sets locale-specific details that affect the symbols substituted into the pattern string affixes.boolean
strictEquals(Modifier other)
Returns whether this Modifier equals another Modifier.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface com.ibm.icu.impl.number.Modifier
semanticallyEquivalent
-
-
-
-
Field Detail
-
isStrong
final boolean isStrong
-
patternInfo
AffixPatternProvider patternInfo
-
field
NumberFormat.Field field
-
signDisplay
NumberFormatter.SignDisplay signDisplay
-
perMilleReplacesPercent
boolean perMilleReplacesPercent
-
approximately
boolean approximately
-
symbols
DecimalFormatSymbols symbols
-
unitWidth
NumberFormatter.UnitWidth unitWidth
-
currency
Currency currency
-
rules
PluralRules rules
-
signum
Modifier.Signum signum
-
plural
StandardPlural plural
-
parent
MicroPropsGenerator parent
-
currentAffix
java.lang.StringBuilder currentAffix
-
-
Constructor Detail
-
MutablePatternModifier
public MutablePatternModifier(boolean isStrong)
- Parameters:
isStrong
- Whether the modifier should be considered strong. For more information, seeModifier.isStrong()
. Most of the time, decimal format pattern modifiers should be considered as non-strong.
-
-
Method Detail
-
setPatternInfo
public void setPatternInfo(AffixPatternProvider patternInfo, NumberFormat.Field field)
Sets a reference to the parsed decimal format pattern, usually obtained fromPatternStringParser.parseToPatternInfo(String)
, but any implementation ofAffixPatternProvider
is accepted.- Parameters:
field
- Which field to use for literal characters in the pattern.
-
setPatternAttributes
public void setPatternAttributes(NumberFormatter.SignDisplay signDisplay, boolean perMille, boolean approximately)
Sets attributes that imply changes to the literal interpretation of the pattern string affixes.- Parameters:
signDisplay
- Whether to force a plus sign on positive numbers.perMille
- Whether to substitute the percent sign in the pattern with a permille sign.approximately
- Whether to prepend approximately to the sign
-
setSymbols
public void setSymbols(DecimalFormatSymbols symbols, Currency currency, NumberFormatter.UnitWidth unitWidth, PluralRules rules)
Sets locale-specific details that affect the symbols substituted into the pattern string affixes.- Parameters:
symbols
- The desired instance of DecimalFormatSymbols.currency
- The currency to be used when substituting currency values into the affixes.unitWidth
- The width used to render currencies.rules
- Required if the triple currency sign, "¤¤¤", appears in the pattern, which can be determined from the convenience methodneedsPlurals()
.
-
setNumberProperties
public void setNumberProperties(Modifier.Signum signum, StandardPlural plural)
Sets attributes of the current number being processed.- Parameters:
signum
- -1 if negative; +1 if positive; or 0 if zero.plural
- The plural form of the number, required only if the pattern contains the triple currency sign, "¤¤¤" (and as indicated byneedsPlurals()
).
-
needsPlurals
public boolean needsPlurals()
Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize. This is currently true only if there is a currency long name placeholder in the pattern ("¤¤¤").
-
createImmutable
public MutablePatternModifier.ImmutablePatternModifier createImmutable()
Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable and can be saved for future use. The number properties in the current instance are mutated; all other properties are left untouched.The resulting modifier cannot be used in a QuantityChain.
- Returns:
- An immutable that supports both positive and negative numbers.
-
createConstantModifier
private ConstantMultiFieldModifier createConstantModifier(FormattedStringBuilder a, FormattedStringBuilder b)
Uses the current properties to create a singleConstantMultiFieldModifier
with currency spacing support if required.- Parameters:
a
- A working FormattedStringBuilder object; passed from the outside to prevent the need to create many new instances if this method is called in a loop.b
- Another working FormattedStringBuilder object.- Returns:
- The constant modifier object.
-
addToChain
public MicroPropsGenerator addToChain(MicroPropsGenerator parent)
Used by the unsafe code path.
-
processQuantity
public MicroProps processQuantity(DecimalQuantity fq)
Description copied from interface:MicroPropsGenerator
Considers the givenDecimalQuantity
, optionally mutates it, and returns aMicroProps
.- Specified by:
processQuantity
in interfaceMicroPropsGenerator
- Parameters:
fq
- The quantity for consideration and optional mutation.- Returns:
- A MicroProps instance resolved for the quantity.
-
apply
public int apply(FormattedStringBuilder output, int leftIndex, int rightIndex)
Description copied from interface:Modifier
Apply this Modifier to the string builder.- Specified by:
apply
in interfaceModifier
- Parameters:
output
- The string builder to which to apply this modifier.leftIndex
- The left index of the string within the builder. Equal to 0 when only one number is being formatted.rightIndex
- The right index of the string within the string builder. Equal to length when only one number is being formatted.- Returns:
- The number of characters (UTF-16 code units) that were added to the string builder.
-
getPrefixLength
public int getPrefixLength()
Description copied from interface:Modifier
Gets the length of the prefix. This information can be used in combination withModifier.apply(com.ibm.icu.impl.FormattedStringBuilder, int, int)
to extract the prefix and suffix strings.- Specified by:
getPrefixLength
in interfaceModifier
- Returns:
- The number of characters (UTF-16 code units) in the prefix.
-
getCodePointCount
public int getCodePointCount()
Description copied from interface:Modifier
Returns the number of code points in the modifier, prefix plus suffix.- Specified by:
getCodePointCount
in interfaceModifier
-
isStrong
public boolean isStrong()
Description copied from interface:Modifier
Whether this modifier is strong. If a modifier is strong, it should always be applied immediately and not allowed to bubble up. With regard to padding, strong modifiers are considered to be on the inside of the prefix and suffix.
-
containsField
public boolean containsField(java.text.Format.Field field)
Description copied from interface:Modifier
Whether the modifier contains at least one occurrence of the given field.- Specified by:
containsField
in interfaceModifier
-
getParameters
public Modifier.Parameters getParameters()
Description copied from interface:Modifier
Gets a set of "parameters" for this Modifier.- Specified by:
getParameters
in interfaceModifier
-
strictEquals
public boolean strictEquals(Modifier other)
Description copied from interface:Modifier
Returns whether this Modifier equals another Modifier.- Specified by:
strictEquals
in interfaceModifier
-
insertPrefix
private int insertPrefix(FormattedStringBuilder sb, int position)
-
insertSuffix
private int insertSuffix(FormattedStringBuilder sb, int position)
-
prepareAffix
private void prepareAffix(boolean isPrefix)
Pre-processes the prefix or suffix into the currentAffix field, creating and mutating that field if necessary. Calls down toPatternStringUtils#affixPatternProviderToStringBuilder
.- Parameters:
isPrefix
- true to prepare the prefix; false to prepare the suffix.
-
getSymbol
public java.lang.CharSequence getSymbol(int type)
Returns the string that substitutes a given symbol type in a pattern.- Specified by:
getSymbol
in interfaceAffixUtils.SymbolProvider
-
getCurrencySymbolForUnitWidth
public java.lang.String getCurrencySymbolForUnitWidth()
Returns the currency symbol for the unit width specified in setSymbols()
-
-