Skip to content

Commit bc176fb

Browse files
authored
Merge pull request #6002 from MasterQ32/zig_fmt_align_fix
Fixes floating point alignment in std.fmt.format
2 parents 56e1080 + 6701046 commit bc176fb

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

lib/std/fmt.zig

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,13 +560,25 @@ fn formatFloatValue(
560560
options: FormatOptions,
561561
writer: anytype,
562562
) !void {
563+
// this buffer should be enough to display all decimal places of a decimal f64 number.
564+
var buf: [512]u8 = undefined;
565+
var buf_stream = std.io.fixedBufferStream(&buf);
566+
563567
if (fmt.len == 0 or comptime std.mem.eql(u8, fmt, "e")) {
564-
return formatFloatScientific(value, options, writer);
568+
formatFloatScientific(value, options, buf_stream.writer()) catch |err| switch (err) {
569+
error.NoSpaceLeft => unreachable,
570+
else => |e| return e,
571+
};
565572
} else if (comptime std.mem.eql(u8, fmt, "d")) {
566-
return formatFloatDecimal(value, options, writer);
573+
formatFloatDecimal(value, options, buf_stream.writer()) catch |err| switch (err) {
574+
error.NoSpaceLeft => unreachable,
575+
else => |e| return e,
576+
};
567577
} else {
568578
@compileError("Unknown format string: '" ++ fmt ++ "'");
569579
}
580+
581+
return formatBuf(buf_stream.getWritten(), options, writer);
570582
}
571583

572584
pub fn formatText(
@@ -1791,3 +1803,17 @@ test "padding" {
17911803
try testFmt("==================Filled", "{:=>24}", .{"Filled"});
17921804
try testFmt(" Centered ", "{:^24}", .{"Centered"});
17931805
}
1806+
1807+
test "decimal float padding" {
1808+
var number: f32 = 3.1415;
1809+
try testFmt("left-pad: **3.141\n", "left-pad: {d:*>7.3}\n", .{number});
1810+
try testFmt("center-pad: *3.141*\n", "center-pad: {d:*^7.3}\n", .{number});
1811+
try testFmt("right-pad: 3.141**\n", "right-pad: {d:*<7.3}\n", .{number});
1812+
}
1813+
1814+
test "sci float padding" {
1815+
var number: f32 = 3.1415;
1816+
try testFmt("left-pad: **3.141e+00\n", "left-pad: {e:*>11.3}\n", .{number});
1817+
try testFmt("center-pad: *3.141e+00*\n", "center-pad: {e:*^11.3}\n", .{number});
1818+
try testFmt("right-pad: 3.141e+00**\n", "right-pad: {e:*<11.3}\n", .{number});
1819+
}

0 commit comments

Comments
 (0)