aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-08-10 20:09:11 -0400
committerGitHub <noreply@github.com>2020-08-10 20:09:11 -0400
commitbc176fb7390b4d03b786bbc567448836140a67fc (patch)
tree20411f966bb98776782ad2c4a26d76d0d7973640 /lib
parent56e1080ba3535939565f5291526c184c34f6f63a (diff)
parent6701046cdd85d7a702be38a593e8385a5dfb4562 (diff)
downloadzig-bc176fb7390b4d03b786bbc567448836140a67fc.tar.gz
zig-bc176fb7390b4d03b786bbc567448836140a67fc.zip
Merge pull request #6002 from MasterQ32/zig_fmt_align_fix
Fixes floating point alignment in std.fmt.format
Diffstat (limited to 'lib')
-rw-r--r--lib/std/fmt.zig30
1 files changed, 28 insertions, 2 deletions
diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig
index c9ba3b3470..6dbef5db67 100644
--- a/lib/std/fmt.zig
+++ b/lib/std/fmt.zig
@@ -560,13 +560,25 @@ fn formatFloatValue(
options: FormatOptions,
writer: anytype,
) !void {
+ // this buffer should be enough to display all decimal places of a decimal f64 number.
+ var buf: [512]u8 = undefined;
+ var buf_stream = std.io.fixedBufferStream(&buf);
+
if (fmt.len == 0 or comptime std.mem.eql(u8, fmt, "e")) {
- return formatFloatScientific(value, options, writer);
+ formatFloatScientific(value, options, buf_stream.writer()) catch |err| switch (err) {
+ error.NoSpaceLeft => unreachable,
+ else => |e| return e,
+ };
} else if (comptime std.mem.eql(u8, fmt, "d")) {
- return formatFloatDecimal(value, options, writer);
+ formatFloatDecimal(value, options, buf_stream.writer()) catch |err| switch (err) {
+ error.NoSpaceLeft => unreachable,
+ else => |e| return e,
+ };
} else {
@compileError("Unknown format string: '" ++ fmt ++ "'");
}
+
+ return formatBuf(buf_stream.getWritten(), options, writer);
}
pub fn formatText(
@@ -1791,3 +1803,17 @@ test "padding" {
try testFmt("==================Filled", "{:=>24}", .{"Filled"});
try testFmt(" Centered ", "{:^24}", .{"Centered"});
}
+
+test "decimal float padding" {
+ var number: f32 = 3.1415;
+ try testFmt("left-pad: **3.141\n", "left-pad: {d:*>7.3}\n", .{number});
+ try testFmt("center-pad: *3.141*\n", "center-pad: {d:*^7.3}\n", .{number});
+ try testFmt("right-pad: 3.141**\n", "right-pad: {d:*<7.3}\n", .{number});
+}
+
+test "sci float padding" {
+ var number: f32 = 3.1415;
+ try testFmt("left-pad: **3.141e+00\n", "left-pad: {e:*>11.3}\n", .{number});
+ try testFmt("center-pad: *3.141e+00*\n", "center-pad: {e:*^11.3}\n", .{number});
+ try testFmt("right-pad: 3.141e+00**\n", "right-pad: {e:*<11.3}\n", .{number});
+}