How to format strings in Java

后端 未结 8 1935
执笔经年
执笔经年 2020-11-22 10:44

Primitive question, but how do I format strings like this:

\"Step {1} of {2}\"

by substituting variables using Java? In C# it\'s

相关标签:
8条回答
  • 2020-11-22 11:00

    Take a look at String.format. Note, however, that it takes format specifiers similar to those of C's printf family of functions -- for example:

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

    Would return "Hello world, 42". You may find this helpful when learning about the format specifiers. Andy Thomas-Cramer was kind enough to leave this link in a comment below, which appears to point to the official spec. The most commonly used ones are:

    • %s - insert a string
    • %d - insert a signed integer (decimal)
    • %f - insert a real number, standard notation

    This is radically different from C#, which uses positional references with an optional format specifier. That means that you can't do things like:

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

    ... without actually repeating the parameter passed to printf/format. (see The Scrum Meister's comment below)


    If you just want to print the result directly, you may find System.out.printf (PrintStream.printf) to your liking.

    0 讨论(0)
  • 2020-11-22 11:00

    I wrote this function it does just the right thing. Interpolate a word starting with $ with the value of the variable of the same name.

    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;
    }
    
    0 讨论(0)
  • 2020-11-22 11:04

    In addition to String.format, also take a look java.text.MessageFormat. The format less terse and a bit closer to the C# example you've provided and you can use it for parsing as well.

    For example:

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

    A nicer example takes advantage of the varargs and autoboxing improvements in Java 1.5 and turns the above into a one-liner:

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

    MessageFormat is a little bit nicer for doing i18nized plurals with the choice modifier. To specify a message that correctly uses the singular form when a variable is 1 and plural otherwise, you can do something like this:

    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) });
    
    0 讨论(0)
  • 2020-11-22 11:05
    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("================================");
    
        }
    }
    

    outpot "================================"
    ved15space123 ved15space123 ved15space123 "================================

    Java solution

    • The "-" is used to left indent

    • The "15" makes the String's minimum length it takes up be 15

    • The "s" (which is a few characters after %) will be substituted by our String
    • The 0 pads our integer with 0s on the left
    • The 3 makes our integer be a minimum length of 3
    0 讨论(0)
  • 2020-11-22 11:07

    If you choose not to use String.format, the other option is the + binary operator

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

    This is the equivalent of

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

    Whichever you use is your choice. StringBuilder is faster, but the speed difference is marginal. I prefer to use the + operator (which does a StringBuilder.append(String.valueOf(X))) and find it easier to read.

    0 讨论(0)
  • 2020-11-22 11:13

    Java 15

    There is a new instance method called String::formatted(Object... args) as of Java 15.

    The internal implementation is same to String::format(String format, Object... args).

    Formats using this string as the format string, and the supplied arguments.

    String step1 = "one";
    String step2 = "two";
    
    // results in "Step one of two"
    String string = "Step %s of %s".formatted(step1, step2);     
    

    Advantage: The difference is that the method is not static and the formatting pattern is a string itself from which a new one is created based on the args. This allows chaining to build the format itself first.

    Disadvantage: There is no overloaded method with Locale, therefore uses the default one. If you need to use a custom Locale, you have to stick with String::format(Locale l,String format,Object... args).

    0 讨论(0)
提交回复
热议问题