String Formatting in Karel

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 excellent support for string formatting in
        // the printf tradition. Here are some examples of
        // common string formatting tasks.

        // Java offers several printing "verbs" 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 variant will
        // include the object's toString() representation.
        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 straight-forward.
        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 %s with quotes.
        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 %h for hashcode.
        System.out.printf("pointer: %h%n", p);

        // 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 verb. 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 outputs using
        // Formatter with any OutputStream.
        Formatter formatter = new Formatter(System.err);
        formatter.format("io: an %s%n", "error");
        formatter.close();
    }
}

This Java program demonstrates various string formatting techniques similar to those in the original Go example. Here are some key points about the Java version:

  1. Java uses System.out.printf() for formatted printing, which is similar to Go’s fmt.Printf().

  2. The %n is used for newlines in Java’s printf, whereas Go uses \n.

  3. Java doesn’t have a direct equivalent to Go’s %#v for printing a source code representation of a value. We’ve omitted this in the Java version.

  4. For binary representation of integers, we use Integer.toBinaryString() in Java.

  5. To print hexadecimal representation of a string’s bytes, we use javax.xml.bind.DatatypeConverter.printHexBinary().

  6. Java doesn’t have pointers, so we use the object’s hashcode as an analogue to Go’s pointer printing.

  7. Java’s Formatter class is used to demonstrate formatting to different outputs, similar to Go’s Fprintf.

To run this program, save it as StringFormatting.java, compile it with javac StringFormatting.java, and then run it with java StringFormatting.