String Formatting in Java

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

To run the program, compile and execute it:

$ javac StringFormatting.java
$ java StringFormatting
struct1: Point@4617c264
struct2: Point@4617c264
type: Point
bool: true
int: 123
bin: 1110
char: !
hex: 1c8
float1: 78.900000
float2: 1.234000e+08
float3: 1.234000E+08
str1: "string"
str2: "string"
str3: 6865782074686973
pointer: 1175962212
width1: |    12|   345|
width2: |  1.20|  3.45|
width3: |1.20  |3.45  |
width4: |   foo|     b|
width5: |foo   |b     |
sprintf: a string
io: an error

This example demonstrates various string formatting techniques in Java, which are similar to those in other languages. The System.out.printf() and String.format() methods in Java provide functionality similar to fmt.Printf() and fmt.Sprintf() respectively.