util.dataforms: Ensure larger integers are serialized as such
authorKim Alvefur <zash@zash.se>
Thu, 28 Oct 2021 13:00:24 +0200
changeset 11884 d30c81b875f2
parent 11883 b8b889ba8d27
child 11885 2138fc13d53a
util.dataforms: Ensure larger integers are serialized as such Assumes that most number fields are integers, as most numeric types listed in XEP-0122 are, as are all such fields in Prosody as of this. Otherwise %g produces something like 1.1259e+15
spec/util_dataforms_spec.lua
util/dataforms.lua
--- a/spec/util_dataforms_spec.lua	Tue Oct 26 15:41:54 2021 +0200
+++ b/spec/util_dataforms_spec.lua	Thu Oct 28 13:00:24 2021 +0200
@@ -458,6 +458,12 @@
 				assert.table(e);
 				assert.string(e.number);
 			end);
+
+			it("serializes largeer ints okay", function ()
+				local x = f:form{number=1125899906842624}
+				assert.equal("1125899906842624", x:find("field/value#"))
+			end);
+
 		end)
 
 		describe("datetime", function ()
--- a/util/dataforms.lua	Tue Oct 26 15:41:54 2021 +0200
+++ b/util/dataforms.lua	Thu Oct 28 13:00:24 2021 +0200
@@ -107,8 +107,10 @@
 					value = datetime.datetime(value);
 				elseif field_type == "boolean" then
 					value = value ~= 0;
+				elseif field.datatype == "xs:double" or field.datatype == "xs:decimal" then
+					value = ("%f"):format(value);
 				else
-					value = ("%g"):format(value);
+					value = ("%d"):format(value);
 				end
 			end
 			-- Add value, depending on type