util.format: Handle formats expecting an integer in Lua 5.3+ (fixes #1371)
authorKim Alvefur <zash@zash.se>
Thu, 30 May 2019 13:41:05 +0200
changeset 10038 4fca92d60040
parent 10037 ca8333d1a7fe
child 10039 386f085820e6
util.format: Handle formats expecting an integer in Lua 5.3+ (fixes #1371)
spec/util_format_spec.lua
util/format.lua
--- a/spec/util_format_spec.lua	Tue May 28 00:56:30 2019 +0200
+++ b/spec/util_format_spec.lua	Thu May 30 13:41:05 2019 +0200
@@ -12,6 +12,7 @@
 			assert.equal("[true]", format("%d", true));
 			assert.equal("% [true]", format("%%", true));
 			assert.equal("{ }", format("%q", { }));
+			assert.equal("[1.5]", format("%d", 1.5));
 		end);
 	end);
 end);
--- a/util/format.lua	Tue May 28 00:56:30 2019 +0200
+++ b/util/format.lua	Thu May 30 13:41:05 2019 +0200
@@ -7,6 +7,9 @@
 local pack = require "util.table".pack; -- TODO table.pack in 5.2+
 local type = type;
 local dump = require "util.serialization".new("debug");
+local num_type = math.type;
+
+local expects_integer = num_type and { c = true, d = true, i = true, o = true, u = true, X = true, x = true, } or {};
 
 local function format(formatstring, ...)
 	local args = pack(...);
@@ -43,6 +46,9 @@
 			elseif type(arg) ~= "number" then -- arg isn't number as expected?
 				args[i] = tostring(arg);
 				spec = "[%s]";
+			elseif expects_integer[option] and num_type(arg) ~= "integer" then
+				args[i] = tostring(arg);
+				spec = "[%s]";
 			end
 		end
 		return spec;