Как использовать 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.
Скорее всего, выше дополненная информация ни на что не повлияет, но всё таки...