Notice that the 0x is omitted when i == 0. The 0x prefix is specified by '#' (and 'x') in the format string. If this is expected behavior, then it sure is surprising and undocumented AFAIK. goes back to double check
sprintf has been documented that the prefix is only added on non-zero since 67151cd7af01f97524f0a14cf5abd9567f856155 in 2008, so this isn't a bug, but a feature request. Adding the prefix even on zero seems more reasonable to me, but I'm not sure the backwards compatibility loss is worth it. It's also questionable how this would interact with the space, plus, and minus flags. Here's a commit that implements it and passes the sprintf tests/specs: https://github.com/jeremyevans/ruby/commit/2adaaa87f2cf40c21f2560b34fafdce0ef45d321