Как использовать MessageFormat с choice и массивом строк

Имеется legacy продукт, в котором некоторая конфигурация использует resource файлы. В resorce файлах находятся строковые паттерны для форматирования с помощью MessageFormat в связке с ChoiceFormat, например: {0,choice,120#true|121#false}, {1,choice,99<false|100#true|100<false|200<true}. Имеются также и другие паттерны, но проблема именно с вышеуказанными. Проблема заключается в том, что объект, который используется в MessageFormat - это массив строк, а не чисел и согласно документации:

ChoiceFormat allows you to attach a format to a range of numbers.
ChoiceFormat позволяет прикрепить формат к диапазону чисел.

Поэтому при передаче параметром массива строк выбрасывается исключение IllegalArgumentException.
Вопрос: можно ли каким-либо способом указать на необходимость преобразования строки в число именно в строке формата?

import java.util.Arrays;
import java.text.*;
public class TestConsole {
    public static void main(String[] args) {
        
        Object[] arguments = {
                -2, -1, 0, 1, 2, 118, 119, 120, 121, 122, 123, "120"
        };
        String pattern = "{0,choice,119<false|120#true|120<false|121<true}";
        
        System.out.println(String.format("Arguments: %s", Arrays.toString(arguments)));
        System.out.println(String.format("Pattern: %s", pattern));
        
        try {
            MessageFormat mf = new MessageFormat(pattern);
            for(Object arg : arguments) {
                System.out.println(String.format("formated with %s: %s", arg, mf.format(new Object[] {arg})));  
            }
        }
        catch (Exception e) {
            String errFormat = "An error \"%s\" occurred\r\nwhile formatting the pattern \"%s\".\r\n\"%s\"";
            String errMsg = String.format(errFormat, e.getClass().getName(), pattern, e.getMessage());
            System.out.println(errMsg);
        }
    }
}
// OUTPUT
// Arguments: [-2, -1, 0, 1, 2, 118, 119, 120, 121, 122, 123, 120]
// Pattern: {0,choice,119<false|120#true|120<false|121<true}
// formated with -2: false
// formated with -1: false
// formated with 0: false
// formated with 1: false
// formated with 2: false
// formated with 118: false
// formated with 119: false
// formated with 120: true
// formated with 121: false
// formated with 122: true
// formated with 123: true
// An error "java.lang.IllegalArgumentException" occurred
// while formatting the pattern "{0,choice,119<false|120#true|120<false|121<true}".
// "Cannot format given Object as a Number"

Поиграться с кодом онлайн можно здесь.


UPDATE

Ещё раз перечитал текст вопроса, посмотрел на минус, голоса за закрытие и решил всё таки отдельно уточнить и дополнить информацией вопрос.

Вся конфигурация используется для сопоставления (mapping'а) двух независимых API и знать заранее типы не представляется возможным.
Приведённый в коде массив объектов (Object[] arguments) используется здесь только для теста и его последнее строковое значение показывает возникающее исключение.
Код принимает как входной параметр Object (то, что нужно форматировать), и строку с FormatMessage. Другими словами, в строке формата может быть ChoiceFormat, а может и не быть.
В коде выполняется проверка на присутствие в строке формата ChoiceFormat и только в этом случае выполняется попытка привести значение объекта к Integer.

Скорее всего, выше дополненная информация ни на что не повлияет, но всё таки...


Ответы (0 шт):