В то время как GWT не эмулирует все ядро Java, что может быть использовано как альтернатива для:
String.format("The answer is - %d", 42)?
Каков эластичный и эффективный шаблон для ввода аргументов в сообщение в GWT?
В то время как GWT не эмулирует все ядро Java, что может быть использовано как альтернатива для:
String.format("The answer is - %d", 42)?
Каков эластичный и эффективный шаблон для ввода аргументов в сообщение в GWT?
Одним из элегантных решений является использование шаблонов SafeHtml. Вы можете определить несколько таких шаблонов в интерфейсе, например:
public interface MyTemplates extends SafeHtmlTemplates {
@Template("The answer is - {0}")
SafeHtml answer(int value);
@Template("...")
...
}
И затем используйте их:
public static final MyTemplates TEMPLATES = GWT.create(MyTemplates.class);
...
Label label = new Label(TEMPLATES.answer(42));
Хотя это немного больше работы по настройке, у него есть огромное преимущество в том, что аргументы автоматически экранируются HTML. Для получения дополнительной информации см. https://developers.google.com/web-toolkit/doc/latest/DevGuideSecuritySafeHtml
Если вы хотите сделать еще один шаг вперед и интернационализировать свои сообщения, см. также https://developers.google.com/web-toolkit/doc/latest/DevGuideI18nMessages#SafeHtmlMessages
Вы можете просто написать свой собственный format function
вместо того, чтобы делать мозговой штурм.
public static String format(final String format, final String... args,String delimiter) {
String[] split = format.split(delimiter);//in your case "%d" as delimeter
final StringBuffer buffer= new StringBuffer();
for (int i= 0; i< split.length - 1; i+= 1) {
buffer.append(split[i]);
buffer.append(args[i]);
}
buffer.append(split[split.length - 1]);
return buffer.toString();
}
Поскольку большинство (как в 99,999%) форматов сообщений являются статическими, известными во время компиляции, способ, которым подходит GWT, состоит в том, чтобы анализировать их во время компиляции.
Обычно вы используете подтекст Messages
для его возможности локализовать сообщение, но вам иногда может понадобиться SafeHtmlTemplates
.
В 0.001%, когда шаблон не известен во время компиляции, вы можете использовать Javascript sprintf (см.: http://www.diveintojavascript.com/projects/javascript-sprintf), как в:
public static native String format (String format, JsArrayMixed values) /*-{
return vsprintf(format, values);
}-*/;
Вы можете написать свой собственный.
Я написал версию, которая работает только со строками (% s):
public static String format(final String format, final Object... args)
{
checkNotNull(format);
checkNotNull(args);
final String pattern = "%s";
int start = 0, last = 0, argsIndex = 0;
final StringBuilder result = new StringBuilder();
while ((start = format.indexOf(pattern, last)) != -1)
{
if (args.length <= argsIndex)
{
throw new IllegalArgumentException("There is more replace patterns than arguments!");
}
result.append(format.substring(last, start));
result.append(args[argsIndex++]);
last = start + pattern.length();
}
if (args.length > argsIndex)
{
throw new IllegalArgumentException("There is more arguments than replace patterns!");
}
result.append(format.substring(last));
return result.toString();
}
почему бы не написать такой метод, как:
String appendAnswer(int result) {
return "The answer is - " + Integer.toString(result);
}
решает вашу проблему, потому что вы ничего не делаете, как форматирование в коде.
Если вы столкнулись с такой проблемой, как преобразование integer/byte в Hex String, вы должны использовать:
Integer.toString(int, 16);
Я не очень хорошо знаю GWT, но я работаю над проектом GWT, и мне это нужно. Попробовав некоторые альтернативы, я обнаружил, что это работает;
import java.text.MessageFormat;
MessageFormat.format("The answer is - {0}", 42);
Я не знаю, добавили ли разработчики проекта что-то особенное, чтобы сделать эту работу или она работает по умолчанию.