Defines rules for mapping positive double values onto a small set of keywords. Serializable so can be used in formatters, which are serializable. Rules are constructed from a text description, consisting of a series of keywords and conditions. The {@link #select} methodexamines each condition in order and returns the keyword for the first condition that matches the number. If none match, {@link #KEYWORD_OTHER} is returned.
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 = condition = and_condition ('or' and_condition) and_condition = relation ('and' relation) relation = is_relation | in_relation | within_relation | 'n' is_relation = expr 'is' ('not')? value in_relation = expr ('not')? 'in' range within_relation = expr ('not')? 'within' range expr = 'n' ('mod' value)? value = digit+ digit = 0|1|2|3|4|5|6|7|8|9 range = value'..'value
The difference between 'in' and 'within' is that 'in' only includes integers in the specified range, while 'within' includes all values.
@stable ICU 3.8