A1exandr Belan
A1exandr Belan

Reputation: 4780

What is the alternative for String.format() in GWT?

While GWT is not emulate all java's core, what can be used as alternative for:

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

What is the ellegant and efficient pattern to inject arguments to message in GWT?

Upvotes: 24

Views: 16430

Answers (7)

Pwnstar
Pwnstar

Reputation: 2245

why not writing a method like:

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

is resolving your problem because you do nothing like formatting in your code.

if you ever face the problem like converting integer/byte to Hex String you should use:

Integer.toString(int, 16); 

Upvotes: 0

sedran
sedran

Reputation: 3566

I don't know GWT much but I am working on a GWT project and I needed this. While trying some alternatives, I have found that this is working;

import java.text.MessageFormat;



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

I don't know if the project's developers added something special to make this work or it is working by default.

Upvotes: -5

0x3333
0x3333

Reputation: 674

You can write your own.

I wrote a version that just work with Strings(%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();
}

Upvotes: 0

makeroo
makeroo

Reputation: 527

In the 0.001% when template is not known at compile time you can use Javascript sprintf (see: http://www.diveintojavascript.com/projects/javascript-sprintf) as in:

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

Upvotes: 7

Thomas Broyer
Thomas Broyer

Reputation: 64541

Because most (as in 99.999%) message formats are static, known at compile-time, the way GWT approaches it is to parse them at compile-time.

You'll generally use a Messages subinterface for its ability to localize the message, but you'll sometimes rather need SafeHtmlTemplates.

Upvotes: 7

Suresh Atta
Suresh Atta

Reputation: 121998

You can simply write your own format function instead of doing brain storm.

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();
 }

Upvotes: 7

Chris Lercher
Chris Lercher

Reputation: 37778

One elegant solution is using SafeHtml templates. You can define multiple such templates in an interface like:

public interface MyTemplates extends SafeHtmlTemplates {
  @Template("The answer is - {0}")
  SafeHtml answer(int value);

  @Template("...")
  ...
}

And then use them:

public static final MyTemplates TEMPLATES = GWT.create(MyTemplates.class);

...
Label label = new Label(TEMPLATES.answer(42));

While this is a little bit more work to set up, it has the enormous advantage that arguments are automatically HTML-escaped. For more info, see https://developers.google.com/web-toolkit/doc/latest/DevGuideSecuritySafeHtml

If you want to go one step further, and internationalize your messages, then see also https://developers.google.com/web-toolkit/doc/latest/DevGuideI18nMessages#SafeHtmlMessages

Upvotes: 17

Related Questions