Zig中运行时动态指定精度的数字字符串格式化问题
Zig fmt编译错误:动态指定数值精度的正确写法
你的编译错误完全来自格式字符串"{d:.d}"的语法错误——Zig的格式化规则里没有.d这种写法,编译器解析时会把末尾的d判定为多余字符,从而抛出错误。
你想要动态指定数值的输出精度,Zig提供两种合法写法:
写法1:显式占位符传递精度
使用{d:.{}}作为格式字符串,外层{d}表示格式化整数,内层{}用来接收精度参数:
var buffer: [20]u8 = undefined; const precise_string = std.fmt.bufPrint(&buffer, "{d:.{}}", .{ max, precision }) catch unreachable; std.debug.print("{}", .{precise_string.len});
参数顺序为:先传要格式化的数值max,再传精度值precision。
写法2:用.*简化动态精度
使用{d.*}作为格式字符串,此时参数顺序要调整为精度在前,数值在后:
var buffer: [20]u8 = undefined; const precise_string = std.fmt.bufPrint(&buffer, "{d.*}", .{ precision, max }) catch unreachable; std.debug.print("{}", .{precise_string.len});
这种写法是Zig对动态精度的简化语法,.*会自动匹配后续的精度参数和数值参数。
两种写法都能实现你想要的效果:将max按precision指定的规则格式化为字符串,编译不会再出现语法错误。
内容的提问来源于stack exchange,提问作者Palash Nigam
相关产品推荐
相关产品推荐

