Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sprintf equivalent in Java

Printf got added to Java with the 1.5 release but I can't seem to find how to send the output to a string rather than a file (which is what sprintf does in C). Does anyone know how to do this?

like image 373
paperhorse Avatar asked Sep 05 '08 23:09

paperhorse


People also ask

Is there a Sprintf in Java?

The java string format() method returns a formatted string based on the locale, format, and arguments passed to it. The String. format() in Java is equivalent of the sprintf().

How to use fprintf in Java?

The Java equivalent to fprintf is usually to create a formatted string (e.g. using String. format()) and then print that string to the file. If the contents are relatively short, then we can create one string with all of the required contents concatenated, then use Files.

What does string format do in Java?

In java, String format() method returns a formatted string using the given locale, specified format string, and arguments. We can concatenate the strings using this method and at the same time, we can format the output concatenated string.

What are format specifiers in Java?

Java String Format Specifiersdecimal number, possibly in scientific notation depending on the precision and value. %h. any type. Hex String of value from hashCode() method. %n.


2 Answers

// Store the formatted string in 'result' String result = String.format("%4d", i * j);  // Write the result to standard output System.out.println( result ); 

See format and its syntax

like image 104
Eugene Yokota Avatar answered Sep 23 '22 22:09

Eugene Yokota


Strings are immutable types. You cannot modify them, only return new string instances.

Because of that, formatting with an instance method makes little sense, as it would have to be called like:

String formatted = "%s: %s".format(key, value); 

The original Java authors (and .NET authors) decided that a static method made more sense in this situation, as you are not modifying the target, but instead calling a format method and passing in an input string.

Here is an example of why format() would be dumb as an instance method. In .NET (and probably in Java), Replace() is an instance method.

You can do this:

 "I Like Wine".Replace("Wine","Beer"); 

However, nothing happens, because strings are immutable. Replace() tries to return a new string, but it is assigned to nothing.

This causes lots of common rookie mistakes like:

inputText.Replace(" ", "%20"); 

Again, nothing happens, instead you have to do:

inputText = inputText.Replace(" ","%20"); 

Now, if you understand that strings are immutable, that makes perfect sense. If you don't, then you are just confused. The proper place for Replace() would be where format() is, as a static method of String:

 inputText = String.Replace(inputText, " ", "%20"); 

Now there is no question as to what's going on.

The real question is, why did the authors of these frameworks decide that one should be an instance method, and the other static? In my opinion, both are more elegantly expressed as static methods.

Regardless of your opinion, the truth is that you are less prone to make a mistake using the static version, and the code is easier to understand (No Hidden Gotchas).

Of course there are some methods that are perfect as instance methods, take String.Length()

int length = "123".Length(); 

In this situation, it's obvious we are not trying to modify "123", we are just inspecting it, and returning its length. This is a perfect candidate for an instance method.

My simple rules for Instance Methods on Immutable Objects:

  • If you need to return a new instance of the same type, use a static method.
  • Otherwise, use an instance method.
like image 33
FlySwat Avatar answered Sep 26 '22 22:09

FlySwat