Unexpected behavior of sprintf with i32/u32
Ints and unsigned ints are 16 bits on AVR ATmegas.
So while the argument passed is a 32-bit value, sprintf() is expecting a 16 bit value.  The stack is packed with twice as much data as needed.

From the "2,0,4964" bit, it looks like it taking part of the previous/next parameter during processing, which makes me think this even more.

You need to use long types, e.g.: %ld or %li and %lu