Advanced Formatting
So far we have only covered formatting specifiers. Format strings actually follow this format, where between each pair of square brackets is a parameter you have to replace with something.
{[position][specifier]:[fill][alignment][width].[precision]}
Name | Meaning |
---|---|
Position | The index of the argument that should be inserted |
Specifier | A type-dependent formatting option |
Fill | A single character used for padding |
Alignment | One of three characters < ^ or >; these are for left, middle and right alignment |
Width | The total width of the field (characters) |
Precision | How many decimals a formatted number should have |
Position usage.
const std = @import("std");
const expectEqualStrings = std.testing.expectEqualStrings;
const bufPrint = std.fmt.bufPrint;
test "position" {
var b: [3]u8 = undefined;
try expectEqualStrings(
"aab",
try bufPrint(&b, "{0s}{0s}{1s}", .{ "a", "b" }),
);
}
Fill, alignment and width being used.
const std = @import("std");
const expectEqualStrings = std.testing.expectEqualStrings;
const bufPrint = std.fmt.bufPrint;
test "fill, alignment, width" {
var b: [6]u8 = undefined;
try expectEqualStrings(
"hi! ",
try bufPrint(&b, "{s: <5}", .{"hi!"}),
);
try expectEqualStrings(
"_hi!__",
try bufPrint(&b, "{s:_^6}", .{"hi!"}),
);
try expectEqualStrings(
"!hi!",
try bufPrint(&b, "{s:!>4}", .{"hi!"}),
);
}
Using a specifier with precision.
const std = @import("std");
const expectEqualStrings = std.testing.expectEqualStrings;
const bufPrint = std.fmt.bufPrint;
test "precision" {
var b: [4]u8 = undefined;
try expectEqualStrings(
"3.14",
try bufPrint(&b, "{d:.2}", .{3.14159}),
);
}