Class PluralRules

java.lang.Object
com.ibm.icu.text.PluralRules
All Implemented Interfaces:
Serializable

public class PluralRules extends Object implements Serializable

Defines rules for mapping non-negative numeric values onto a small set of keywords.

Rules are constructed from a text description, consisting of a series of keywords and conditions. The select(double) method examines each condition in order and returns the keyword for the first condition that matches the number. If none match, KEYWORD_OTHER is returned.

A PluralRules object is immutable. It contains caches for sample values, but those are synchronized.

PluralRules is Serializable so that it can be used in formatters, which are serializable.

For more information, details, and tips for writing rules, see the LDML spec, Part 3.5 Language Plural Rules

Examples:

 "one: n is 1; few: n in 2..4"
 

This defines two rules, for 'one' and 'few'. The condition for 'one' is "n is 1" which means that the number must be equal to 1 for this condition to pass. The condition for 'few' is "n in 2..4" which means that the number must be between 2 and 4 inclusive - and be an integer - for this condition to pass. All other numbers are assigned the keyword "other" by the default rule.

 "zero: n is 0; one: n is 1; zero: n mod 100 in 1..19"
 

This illustrates that the same keyword can be defined multiple times. Each rule is examined in order, and the first keyword whose condition passes is the one returned. Also notes that a modulus is applied to n in the last rule. Thus its condition holds for 119, 219, 319...

 "one: n is 1; few: n mod 10 in 2..4 and n mod 100 not in 12..14"
 

This illustrates conjunction and negation. The condition for 'few' has two parts, both of which must be met: "n mod 10 in 2..4" and "n mod 100 not in 12..14". The first part applies a modulus to n before the test as in the previous example. The second part applies a different modulus and also uses negation, thus it matches all numbers not in 12, 13, 14, 112, 113, 114, 212, 213, 214...

Syntax:

 rules         = rule (';' rule)*
 rule          = keyword ':' condition
 keyword       = <identifier>
 condition     = and_condition ('or' and_condition)*
 and_condition = relation ('and' relation)*
 relation      = not? expr not? rel not? range_list
 expr          = ('n' | 'i' | 'f' | 'v' | 't') (mod value)?
 not           = 'not' | '!'
 rel           = 'in' | 'is' | '=' | '≠' | 'within'
 mod           = 'mod' | '%'
 range_list    = (range | value) (',' range_list)*
 value         = digit+
 digit         = 0|1|2|3|4|5|6|7|8|9
 range         = value'..'value
 

Each not term inverts the meaning; however, there should not be more than one of them.

The i, f, t, and v values are defined as follows:

  • i to be the integer digits.
  • f to be the visible decimal digits, as an integer.
  • t to be the visible decimal digits—without trailing zeros—as an integer.
  • v to be the number of visible fraction digits.
  • j is defined to only match integers. That is j is 3 fails if v != 0 (eg for 3.1 or 3.0).

Examples are in the following table:

n i f v
1.0 1 0 1
1.00 1 0 2
1.3 1 3 1
1.03 1 3 2
1.23 1 23 2

An "identifier" is a sequence of characters that do not have the Unicode Pattern_Syntax or Pattern_White_Space properties.

The difference between 'in' and 'within' is that 'in' only includes integers in the specified range, while 'within' includes all values. Using 'within' with a range_list consisting entirely of values is the same as using 'in' (it's not an error).

See Also:
  • Field Details

  • Method Details

    • parseDescription

      public static PluralRules parseDescription(String description) throws ParseException
      Parses a plural rules description and returns a PluralRules.
      Parameters:
      description - the rule description.
      Throws:
      ParseException - if the description cannot be parsed. The exception index is typically not set, it will be -1.
    • createRules

      public static PluralRules createRules(String description)
      Creates a PluralRules from a description if it is parsable, otherwise returns null.
      Parameters:
      description - the rule description.
      Returns:
      the PluralRules
    • newInternal

      @Deprecated public static PluralRules newInternal(String description, com.ibm.icu.impl.number.range.StandardPluralRanges ranges) throws ParseException
      Deprecated.
      This API is ICU internal only.
      Throws:
      ParseException
    • forLocale

      public static PluralRules forLocale(ULocale locale)
      Provides access to the predefined cardinal-number PluralRules for a given locale. Same as forLocale(locale, PluralType.CARDINAL).

      ICU defines plural rules for many locales based on CLDR Language Plural Rules. For these predefined rules, see CLDR page at https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html

      Parameters:
      locale - The locale for which a PluralRules object is returned.
      Returns:
      The predefined PluralRules object for this locale. If there's no predefined rules for this locale, the rules for the closest parent in the locale hierarchy that has one will be returned. The final fallback always returns the default rules.
    • forLocale

      public static PluralRules forLocale(Locale locale)
      Provides access to the predefined cardinal-number PluralRules for a given Locale. Same as forLocale(locale, PluralType.CARDINAL).

      ICU defines plural rules for many locales based on CLDR Language Plural Rules. For these predefined rules, see CLDR page at https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html

      Parameters:
      locale - The locale for which a PluralRules object is returned.
      Returns:
      The predefined PluralRules object for this locale. If there's no predefined rules for this locale, the rules for the closest parent in the locale hierarchy that has one will be returned. The final fallback always returns the default rules.
    • forLocale

      public static PluralRules forLocale(ULocale locale, PluralRules.PluralType type)
      Provides access to the predefined PluralRules for a given locale and the plural type.

      ICU defines plural rules for many locales based on CLDR Language Plural Rules. For these predefined rules, see CLDR page at https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html

      Parameters:
      locale - The locale for which a PluralRules object is returned.
      type - The plural type (e.g., cardinal or ordinal).
      Returns:
      The predefined PluralRules object for this locale. If there's no predefined rules for this locale, the rules for the closest parent in the locale hierarchy that has one will be returned. The final fallback always returns the default rules.
    • forLocale

      public static PluralRules forLocale(Locale locale, PluralRules.PluralType type)
      Provides access to the predefined PluralRules for a given Locale and the plural type.

      ICU defines plural rules for many locales based on CLDR Language Plural Rules. For these predefined rules, see CLDR page at https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html

      Parameters:
      locale - The locale for which a PluralRules object is returned.
      type - The plural type (e.g., cardinal or ordinal).
      Returns:
      The predefined PluralRules object for this locale. If there's no predefined rules for this locale, the rules for the closest parent in the locale hierarchy that has one will be returned. The final fallback always returns the default rules.
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • select

      public String select(double number)
      Given a floating-point number, returns the keyword of the first rule that applies to the number.
      Parameters:
      number - The number for which the rule has to be determined.
      Returns:
      The keyword of the selected rule.
    • select

      public String select(FormattedNumber number)
      Given a formatted number, returns the keyword of the first rule that applies to the number. A FormattedNumber allows you to specify an exponent or trailing zeros, which can affect the plural category. To get a FormattedNumber, see NumberFormatter.
      Parameters:
      number - The number for which the rule has to be determined.
      Returns:
      The keyword of the selected rule.
    • select

      public String select(FormattedNumberRange range)
      Given a formatted number range, returns the overall plural form of the range. For example, "3-5" returns "other" in English. To get a FormattedNumberRange, see NumberRangeFormatter. This method only works if PluralRules was created with a locale. If it was created from PluralRules.createRules(), or if it was deserialized, this method throws UnsupportedOperationException.
      Parameters:
      range - The number range onto which the rules will be applied.
      Returns:
      The keyword of the selected rule.
      Throws:
      UnsupportedOperationException - If called on an instance without plural ranges data.
    • select

      @Deprecated public String select(double number, int countVisibleFractionDigits, long fractionaldigits)
      Deprecated.
      This API is ICU internal only.
      Given a number, returns the keyword of the first rule that applies to the number.
      Parameters:
      number - The number for which the rule has to be determined.
      Returns:
      The keyword of the selected rule.
    • select

      Deprecated.
      This API is ICU internal only.
      Given a number information, returns the keyword of the first rule that applies to the number.
      Parameters:
      number - The number information for which the rule has to be determined.
      Returns:
      The keyword of the selected rule.
    • matches

      @Deprecated public boolean matches(PluralRules.FixedDecimal sample, String keyword)
      Deprecated.
      This API is ICU internal only.
      Given a number information, and keyword, return whether the keyword would match the number.
      Parameters:
      sample - The number information for which the rule has to be determined.
      keyword - The keyword to filter on
    • getKeywords

      public Set<String> getKeywords()
      Returns a set of all rule keywords used in this PluralRules object. The rule "other" is always present by default.
      Returns:
      The set of keywords.
    • getUniqueKeywordValue

      public double getUniqueKeywordValue(String keyword)
      Returns the unique value that this keyword matches, or NO_UNIQUE_VALUE if the keyword matches multiple values or is not defined for this PluralRules.
      Parameters:
      keyword - the keyword to check for a unique value
      Returns:
      The unique value for the keyword, or NO_UNIQUE_VALUE.
    • getUniqueKeywordDecimalQuantityValue

      @Deprecated public com.ibm.icu.impl.number.DecimalQuantity getUniqueKeywordDecimalQuantityValue(String keyword)
      Deprecated.
      This API is ICU internal only.
      Returns the unique value that this keyword matches, or NO_UNIQUE_VALUE if the keyword matches multiple values or is not defined for this PluralRules.
      Parameters:
      keyword - the keyword to check for a unique value
    • getAllKeywordValues

      public Collection<Double> getAllKeywordValues(String keyword)
      Returns all the values that trigger this keyword, or null if the number of such values is unlimited.
      Parameters:
      keyword - the keyword
      Returns:
      the values that trigger this keyword, or null. The returned collection is immutable. It will be empty if the keyword is not defined.
    • getAllKeywordDecimalQuantityValues

      @Deprecated public Collection<com.ibm.icu.impl.number.DecimalQuantity> getAllKeywordDecimalQuantityValues(String keyword)
      Deprecated.
      This API is ICU internal only.
      Returns all the values that trigger this keyword, or null if the number of such values is unlimited.
      Parameters:
      keyword - the keyword
      Returns:
      the values that trigger this keyword, or null. The returned collection is immutable. It will be empty if the keyword is not defined.
    • getAllKeywordValues

      @Deprecated public Collection<com.ibm.icu.impl.number.DecimalQuantity> getAllKeywordValues(String keyword, PluralRules.SampleType type)
      Deprecated.
      This API is ICU internal only.
      Returns all the values that trigger this keyword, or null if the number of such values is unlimited.
      Parameters:
      keyword - the keyword
      type - the type of samples requested, INTEGER or DECIMAL
      Returns:
      the values that trigger this keyword, or null. The returned collection is immutable. It will be empty if the keyword is not defined.
    • getSamples

      public Collection<Double> getSamples(String keyword)
      Returns a list of integer values for which select() would return that keyword, or null if the keyword is not defined. The returned collection is unmodifiable. The returned list is not complete, and there might be additional values that would return the keyword.
      Parameters:
      keyword - the keyword to test
      Returns:
      a list of values matching the keyword.
    • getDecimalQuantitySamples

      @Deprecated public Collection<com.ibm.icu.impl.number.DecimalQuantity> getDecimalQuantitySamples(String keyword)
      Deprecated.
      ICU internal only
      Returns a list of integer values for which select() would return that keyword, or null if the keyword is not defined. The returned collection is unmodifiable. The returned list is not complete, and there might be additional values that would return the keyword.
      Parameters:
      keyword - the keyword to test
      Returns:
      a list of values matching the keyword.
    • getSamples

      @Deprecated public Collection<Double> getSamples(String keyword, PluralRules.SampleType sampleType)
      Deprecated.
      ICU internal only
      Returns a list of values for which select() would return that keyword, or null if the keyword is not defined. The returned collection is unmodifiable. The returned list is not complete, and there might be additional values that would return the keyword. The keyword might be defined, and yet have an empty set of samples, IF there are samples for the other sampleType.
      Parameters:
      keyword - the keyword to test
      sampleType - the type of samples requested, INTEGER or DECIMAL
      Returns:
      a list of values matching the keyword.
    • getDecimalQuantitySamples

      @Deprecated public Collection<com.ibm.icu.impl.number.DecimalQuantity> getDecimalQuantitySamples(String keyword, PluralRules.SampleType sampleType)
      Deprecated.
      ICU internal only
      Returns a list of values for which select() would return that keyword, or null if the keyword is not defined. The returned collection is unmodifiable. The returned list is not complete, and there might be additional values that would return the keyword. The keyword might be defined, and yet have an empty set of samples, IF there are samples for the other sampleType.
      Parameters:
      keyword - the keyword to test
      sampleType - the type of samples requested, INTEGER or DECIMAL
      Returns:
      a list of values matching the keyword.
    • getDecimalSamples

      @Deprecated public PluralRules.DecimalQuantitySamples getDecimalSamples(String keyword, PluralRules.SampleType sampleType)
      Deprecated.
      This API is ICU internal only.
      Returns a list of values for which select() would return that keyword, or null if the keyword is not defined or no samples are available. The returned collection is unmodifiable. The returned list is not complete, and there might be additional values that would return the keyword.
      Parameters:
      keyword - the keyword to test
      sampleType - the type of samples requested, INTEGER or DECIMAL
      Returns:
      a list of values matching the keyword.
    • getAvailableULocales

      public static ULocale[] getAvailableULocales()
      Returns the set of locales for which PluralRules are known.
      Returns:
      the set of locales for which PluralRules are known, as a list
    • getFunctionalEquivalent

      public static ULocale getFunctionalEquivalent(ULocale locale, boolean[] isAvailable)
      Returns the 'functionally equivalent' locale with respect to plural rules. Calling PluralRules.forLocale with the functionally equivalent locale, and with the provided locale, returns rules that behave the same.
      All locales with the same functionally equivalent locale have plural rules that behave the same. This is not exhaustive; there may be other locales whose plural rules behave the same that do not have the same equivalent locale.
      Parameters:
      locale - the locale to check
      isAvailable - if not null and of length > 0, this will hold 'true' at index 0 if locale is directly defined (without fallback) as having plural rules
      Returns:
      the functionally-equivalent locale
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • equals

      public boolean equals(Object rhs)
      Overrides:
      equals in class Object
    • equals

      public boolean equals(PluralRules rhs)
      Returns true if rhs is equal to this.
      Parameters:
      rhs - the PluralRules to compare to.
      Returns:
      true if this and rhs are equal.
    • getKeywordStatus

      public PluralRules.KeywordStatus getKeywordStatus(String keyword, int offset, Set<com.ibm.icu.impl.number.DecimalQuantity> explicits, Output<com.ibm.icu.impl.number.DecimalQuantity> uniqueValue)
      Find the status for the keyword, given a certain set of explicit values.
      Parameters:
      keyword - the particular keyword (call rules.getKeywords() to get the valid ones)
      offset - the offset used, or 0.0d if not. Internally, the offset is subtracted from each explicit value before checking against the keyword values.
      explicits - a set of DecimalQuantitys that are used explicitly (eg [=0], "[=1]"). May be empty or null.
      uniqueValue - If non null, set to the unique value.
      Returns:
      the KeywordStatus
    • getKeywordStatus

      @Deprecated public PluralRules.KeywordStatus getKeywordStatus(String keyword, int offset, Set<com.ibm.icu.impl.number.DecimalQuantity> explicits, Output<com.ibm.icu.impl.number.DecimalQuantity> uniqueValue, PluralRules.SampleType sampleType)
      Deprecated.
      This API is ICU internal only.
      Find the status for the keyword, given a certain set of explicit values.
      Parameters:
      keyword - the particular keyword (call rules.getKeywords() to get the valid ones)
      offset - the offset used, or 0.0d if not. Internally, the offset is subtracted from each explicit value before checking against the keyword values.
      explicits - a set of DecimalQuantitys that are used explicitly (eg [=0], "[=1]"). May be empty or null.
      uniqueValue - If non null, set to the unique value.
      sampleType - request KeywordStatus relative to INTEGER or DECIMAL values
      Returns:
      the KeywordStatus
    • getRules

      @Deprecated public String getRules(String keyword)
      Deprecated.
      This API is ICU internal only.
    • compareTo

      @Deprecated public int compareTo(PluralRules other)
      Deprecated.
      internal
    • isLimited

      @Deprecated public boolean isLimited(String keyword, PluralRules.SampleType sampleType)
      Deprecated.
      internal
    • computeLimited

      @Deprecated public boolean computeLimited(String keyword, PluralRules.SampleType sampleType)
      Deprecated.
      internal