String Formatting in Squirrel

Our example demonstrates various string formatting techniques in Java. Here’s the full source code:

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 printing methods for formatting 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 use the object's toString method.
        System.out.printf("struct2: %s%n", p);

        // To print the type of a value, we can 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 format with quotes in the string.
        System.out.printf("str2: \"%s\"%n", "string");

        // As with integers seen earlier, we can use String.format to get a hex representation of a string.
        System.out.printf("str3: %s%n", String.format("%x", "hex this"));

        // To print a representation of a pointer (object reference in Java), we can use System.identityHashCode.
        System.out.printf("pointer: %x%n", System.identityHashCode(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 format 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 output streams using Formatter.
        Formatter formatter = new Formatter(System.err);
        formatter.format("io: an %s%n", "error");
        formatter.close();
    }
}

To run the program, compile and execute it:

$ javac StringFormatting.java
$ java StringFormatting
struct1: Point@7852e922
struct2: Point@7852e922
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: 7852e922
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 but with some Java-specific syntax and methods.