代码之家  ›  专栏  ›  技术社区  ›  htafoya

Android动态字符串%1d与%1$d

  •  0
  • htafoya  · 技术社区  · 5 年前

    包含$的格式字符串之间有区别吗?

    %1d VS %1$d

    我注意到,在应用程序代码中,我们两个都有,而且两个都工作正常。

    或者顺便说一下 %1d to %2d VS %1$d to %2$d

    0 回复  |  直到 5 年前
        1
  •  1
  •   Boken forcewill    5 年前

    %d -只显示数字

    int first = 10;
    System.out.printf("%d", first);
    // output:
    // 10
    

    %1d -显示包含信息的数字应“保留”多少空间(至少一个)

    int first = 10;
    System.out.printf("->%1d<-", first);
    // output:
    // ->10<-
    

    %9d -保留“9”个字符(如果数字较短-请在此处放置空格),然后右对齐

    int first = 10;
    System.out.printf("->%9d<-", first);
    // output:
    // ->       10<-
    //   123456789
    

    %-9d -同上,但左对齐(此 minus 很重要)

    int first = 10;
    System.out.printf("->%-9d<-", first);
    // output:
    // ->10       <-
    //   123456789
    

    %1$d -使用varargs中元素的位置(在格式中)(这样您就可以重用元素,而不是将它们传递两次)

    int first = 10;
    int second = 20;
    System.out.printf("%1$d %2$d %1$d", first, second);
    // output:
    // 10 20 10
    

    %1$9d -混合两个。获取第一个参数( 1$ )预订九个字符( %9D )

    int first = 10;
    System.out.printf("->%1$9d<-", first);
    // output:
    // ->       10<-
    //   123456789
    
        2
  •  1
  •   Martin Zeitler    5 年前

    看见 java.util.Formatter …它被称为“显式参数索引”。

    当引用1个单索引时,这没有区别,因为顺序不能更改。最常见的用法可能是,在传递一个参数的同时,在同一字符串中替换两次。

    整个图案看起来像这样:

    %[argument_index$][flags][width][.precision]conversion
    
        3
  •  1
  •   htafoya    5 年前

    对于同一个问题的人:他们不一样

    对于发布的示例:

    %1d to %2d VS %1$d to %2$d

    正如Martin所分享的,格式模式是:

    %[argument_index$][flags][width][.precision]conversion

    不放置 $ ,regex使用 %1 , %2 对于以下regex参数,以此类推。

    flags 需要一些特定的值,因此 1 2 被用作 width 参数,指定 最小宽度 . 如果你继续使用相同的模式,你会得到如下的结果:

    String.format("Hello: '%1d' '%2d' '%3d' '%4d'", 1, 2, 3, 4);
    ==> Hello: '1' ' 2' '  3' '   4'
    

    当然,作为 宽度 正在使用参数,%数字将不按需要表示参数顺序:

    String.format("Hello: '%4d' '%3d' '%2d' '%1d'", 1, 2, 3, 4);
        ==> Hello: '   1' '  2' ' 3' '4'