如何用Java格式化字符串


Answers:


140

除了String.format之外,还请看一下java.text.MessageFormat。格式不那么简洁,更接近于您提供的C#示例,您也可以将其用于解析。

例如:

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

一个更好的示例利用了Java 1.5中的varargs和自动装箱改进,并将以上内容变成了一种形式:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormat使用choice修饰符进行国际化复数会更好一些。要指定在变量为1且其他情况为复数时正确使用单数形式的消息,可以执行以下操作:

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });

21
MessageFormat用于本地化,因此在使用时请格外小心。例如,MessageFormat.format("Number {0}", 1234));根据默认语言环境,可以生成以下代码Number 1,234代替Number 1234
pavel_kazlou

@ataylor:您好,抱歉,我有点困惑。我想要这样的东西,我将传递具有数据&when {0} it ll take firstname,when {1} then lastname,的Class对象,就像这样。有可能那样{0,choice,0.getFirstName()}吗?
user3145373 1414年

@ user3145373ツ我不这么认为。
ataylor 2014年

好的,我已经引用了一个我想要的.Net项目codeproject.com/Articles/42310/…,请引用我正在寻找的这个项目。如果您知道任何可用的项目或软件包,请告诉我。谢谢
user3145373 2014年

233

看一下String.format。但是请注意,它需要使用类似于C的printf系列函数的格式说明符-例如:

String.format("Hello %s, %d", "world", 42);

将返回“ Hello world,42”。在了解格式说明符时,您可能会发现很有用。安迪·托马斯·克拉默(Andy Thomas-Cramer)很好,可以在下面的评论中保留链接,该评论似乎指向官方规范。最常用的是:

  • %s-插入一个字符串
  • %d-插入一个有符号整数(十进制)
  • %f-插入一个实数,标准符号

这与C#完全不同,后者使用带有可选格式说明符的位置引用。这意味着您不能执行以下操作:

String.format("The {0} is repeated again: {0}", "word");

... 而无需实际重复传递给printf / format的参数。(请参阅下面的Scrum Meister的评论)


如果只想直接打印结果,则可以按照自己的喜好找到System.out.printf(PrintStream.printf)。


2
另一个选项是java.text.MessageFormat,它确实接受{1}样式格式符号。String.format()的格式符号可以类似于C的printf()格式符号-但也可以不同。有关完整语法,请参见download.oracle.com/javase/6/docs/api/java/util/…
安迪·托马斯

53
String.format也可以采用数字位置:String.format("%2$s %1$s", "foo", "bar");将输出bar foo
Scrum Meister,

7

如果选择不使用String.format,则另一个选项是+二进制运算符

String str = "Step " + a + " of " + b;

这相当于

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

您选择使用哪种。StringBuilder更快,但是速度差异很小。我更喜欢使用+运算符(执行a StringBuilder.append(String.valueOf(X)))并发现它更易于阅读。


5
如果您要拒绝我,请解释原因。
瑞安·阿莫斯

11
1)回答有关字符串格式的问题,然后说明+运算符的工作方式。2)您的解释甚至不准确。+等于使用StringBuilder而不是String.concat(有关这方面的太多信息。)
SørenLøvborg2012年

6

我已经为此写了一个简单的方法:

public class SomeCommons {
    /** Message Format like 'Some String {0} / {1}' with arguments */
    public static String msgFormat(String s, Object... args) {
        return new MessageFormat(s).format(args);
    }
}

因此您可以将其用作:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");

5
public class StringFormat {

    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++){
                String s1=sc.next();
                int x=sc.nextInt();
                System.out.println(String.format("%-15s%03d",s1,x));
            }
            System.out.println("================================");

    }
}

仓库“ ================================
ved15space123 ved15space123 ved15space123” ============ =====================

Java解决方案

  • “-”用于左缩进

  • “ 15”使字符串的最小长度为15

  • “ s”(%之后的几个字符)将由我们的字符串替换
  • 0将我们的整数用左边的0填充
  • 3使我们的整数最小为3


1

这个解决方案对我有用。我需要为REST客户端动态创建网址,因此我创建了此方法,因此您只需要像这样传递restURL

/customer/{0}/user/{1}/order

并根据需要添加任意数量的参数:

public String createURL (String restURL, Object ... params) {       
    return new MessageFormat(restURL).format(params);
}

您只需要这样调用此方法:

createURL("/customer/{0}/user/{1}/order", 123, 321);

输出

“ / customer / 123 / user / 321 / order”


0

我写了这个函数,它做对了。插入以$相同名称的变量值开头的单词。

private static String interpol1(String x){
    Field[] ffield =  Main.class.getDeclaredFields();
    String[] test = x.split(" ") ;
    for (String v : test ) {
        for ( Field n: ffield ) {
            if(v.startsWith("$") && ( n.getName().equals(v.substring(1))  )){
                try {
                    x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
                }catch (Exception e){
                    System.out.println("");
                }
            }
        }
    }
    return x;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.