Java offers excellent support for string formatting using the `String.format()` method or `System.out.printf()`. Here are some examples of common string formatting tasks.
```java
import java.util.Formatter;
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class StringFormatting {
public static void main(String[] args) {
// Java offers several formatting "specifiers" designed to
// format general Java values. For example, this prints
// an instance of our `Point` class.
Point p = new Point(1, 2);
System.out.printf("struct1: %s%n", p);
// If the value is an object, the `%s` specifier will use
// the object's toString() method.
System.out.printf("struct2: %s%n", p);
// To print the type of a value, use `getClass().getName()`.
System.out.printf("type: %s%n", p.getClass().getName());
// Formatting booleans is straightforward.
System.out.printf("bool: %b%n", true);
// There are many options for formatting integers.
// Use `%d` for standard, base-10 formatting.
System.out.printf("int: %d%n", 123);
// This prints a binary representation.
System.out.printf("bin: %s%n", Integer.toBinaryString(14));
// This prints the character corresponding to the given integer.
System.out.printf("char: %c%n", 33);
// `%x` provides hex encoding.
System.out.printf("hex: %x%n", 456);
// There are also several formatting options for floats.
// For basic decimal formatting use `%f`.
System.out.printf("float1: %f%n", 78.9);
// `%e` and `%E` format the float in (slightly different
// versions of) scientific notation.
System.out.printf("float2: %e%n", 123400000.0);
System.out.printf("float3: %E%n", 123400000.0);
// For basic string printing use `%s`.
System.out.printf("str1: %s%n", "\"string\"");
// To double-quote strings, you can use the `%s` specifier
// with quotes in the format string.
System.out.printf("str2: \"%s\"%n", "string");
// As with integers seen earlier, `%x` renders
// the string in base-16, with two output characters
// per byte of input.
System.out.printf("str3: %s%n",
javax.xml.bind.DatatypeConverter.printHexBinary("hex this".getBytes()));
// To print a representation of a pointer, use the
// object's hashCode.
System.out.printf("pointer: %d%n", p.hashCode());
// When formatting numbers you will often want to
// control the width and precision of the resulting
// figure. To specify the width of an integer, use a
// number after the `%` in the specifier. By default the
// result will be right-justified and padded with spaces.
System.out.printf("width1: |%6d|%6d|%n", 12, 345);
// You can also specify the width of printed floats,
// though usually you'll also want to restrict the
// decimal precision at the same time with the
// width.precision syntax.
System.out.printf("width2: |%6.2f|%6.2f|%n", 1.2, 3.45);
// To left-justify, use the `-` flag.
System.out.printf("width3: |%-6.2f|%-6.2f|%n", 1.2, 3.45);
// You may also want to control width when formatting
// strings, especially to ensure that they align in
// table-like output. For basic right-justified width.
System.out.printf("width4: |%6s|%6s|%n", "foo", "b");
// To left-justify use the `-` flag as with numbers.
System.out.printf("width5: |%-6s|%-6s|%n", "foo", "b");
// So far we've seen `printf`, which prints the
// formatted string to `System.out`. `String.format()`
// formats and returns a string without printing it anywhere.
String s = String.format("sprintf: a %s", "string");
System.out.println(s);
// You can format+print to other `PrintStream`s using
// their `printf` method.
System.err.printf("io: an %s%n", "error");
}
}