【问题标题】:What is the alternative for String.format() in GWT?GWT 中 String.format() 的替代方法是什么?
【发布时间】:2013-03-16 18:27:20
【问题描述】:

虽然 GWT 不能模拟所有 java 的核心,但可以用作以下替代方案:

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

在 GWT 中向消息注入参数的优雅高效模式是什么?

【问题讨论】:

    标签: gwt


    【解决方案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();
       }
      

      【讨论】:

      • @downvoter 感谢您对我的帖子感兴趣。请提供评论。以便我改进我的答案。
      【解决方案3】:

      因为大多数(如 99.999%)消息格式是静态的,在编译时已知,GWT 的处理方式是在编译时解析它们。

      您通常会使用Messages subinterface 来本地化消息,但有时您更需要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】:

          你可以自己写。

          我写了一个只适用于 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();
          }
          

          【讨论】:

            【解决方案6】:

            为什么不写这样的方法:

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

            正在解决您的问题,因为您没有在代码中进行格式化之类的操作。

            如果您遇到过将整数/字节转换为十六进制字符串的问题,您应该使用:

            Integer.toString(int, 16); 
            

            【讨论】:

              【解决方案7】:

              我不太了解 GWT,但我正在做一个 GWT 项目,我需要这个。在尝试一些替代方案时,我发现这是可行的;

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

              我不知道该项目的开发人员是否添加了一些特殊的东西来使这项工作正常工作,或者它是默认工作的。

              【讨论】:

              • JRE 仿真库中不存在,因此无法在客户端代码中使用
              • 这对我有用一次。我目前没有从事 GWT 项目。
              猜你喜欢
              • 2015-07-07
              • 1970-01-01
              • 2022-11-13
              • 2015-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多