Подтвердить что ты не робот

Какова альтернатива для String.format() в GWT?

В то время как GWT не эмулирует все ядро ​​Java, что может быть использовано как альтернатива для:

String.format("The answer is - %d", 42)?

Каков эластичный и эффективный шаблон для ввода аргументов в сообщение в GWT?

4b9b3361

Ответ 1

Одним из элегантных решений является использование шаблонов 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

Ответ 2

Вы можете просто написать свой собственный 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();
 }

Ответ 3

Поскольку большинство (как в 99,999%) форматов сообщений являются статическими, известными во время компиляции, способ, которым подходит GWT, состоит в том, чтобы анализировать их во время компиляции.

Обычно вы используете подтекст Messages для его возможности локализовать сообщение, но вам иногда может понадобиться SafeHtmlTemplates.

Ответ 4

В 0.001%, когда шаблон не известен во время компиляции, вы можете использовать Javascript sprintf (см.: http://www.diveintojavascript.com/projects/javascript-sprintf), как в:

public static native String format (String format, JsArrayMixed values) /*-{
  return vsprintf(format, values);
}-*/;

Ответ 5

Вы можете написать свой собственный.

Я написал версию, которая работает только со строками (% 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();
}

Ответ 6

почему бы не написать такой метод, как:

String appendAnswer(int result) {
    return "The answer is - "  + Integer.toString(result);
}

решает вашу проблему, потому что вы ничего не делаете, как форматирование в коде.

Если вы столкнулись с такой проблемой, как преобразование integer/byte в Hex String, вы должны использовать:

Integer.toString(int, 16); 

Ответ 7

Я не очень хорошо знаю GWT, но я работаю над проектом GWT, и мне это нужно. Попробовав некоторые альтернативы, я обнаружил, что это работает;

import java.text.MessageFormat;



MessageFormat.format("The answer is - {0}", 42);

Я не знаю, добавили ли разработчики проекта что-то особенное, чтобы сделать эту работу или она работает по умолчанию.