In message "[ruby-list:39224] Re: printf %b bug (Re:  Re: What processor do you run ruby on?)"
    on 04/02/18, "U.Nakamura" <usa / garbagecollect.jp> writes:

|テストを書きながらいろいろ考えているのですが、現状、もしくは
|[ruby-list:39220]パッチ後の、
|  sprintf("%+04b", -1)  # => "-111"
|  sprintf("%+04o", -1)  # => "-001"
|  sprintf("%+04d", -1)  # => "-001"
|  sprintf("%+04x", -1)  # => "-001"
|というのはきっとまずいですよねえ。
|
|1.8.1は、たまたま
|  sprintf("%+04b", -1)  # => "-001"
|になるようです。
|
|それでは。

これでどうでしょう?

--- sprintf.c	17 Feb 2004 15:26:01 -0000	1.36
+++ sprintf.c	18 Feb 2004 14:00:29 -0000
@@ -547,3 +547,3 @@ rb_f_sprintf(argc, argv)
 			}
-			else if (!(flags&FPREC)) {
+			else if (!(flags&(FPREC|FZERO))) {
 			    strcpy(s, "..");
@@ -606,3 +606,3 @@ rb_f_sprintf(argc, argv)
 			t = RSTRING(tmp)->ptr;
-			if (!(flags&FPREC)) {
+			if (!(flags&(FPREC|FZERO))) {
 			    strcpy(t, "..");
@@ -664,3 +664,3 @@ rb_f_sprintf(argc, argv)
 
-		    if (bignum && !RBIGNUM(val)->sign)
+		    if (!sign && bignum && !RBIGNUM(val)->sign)
 			c = sign_bits(base, p);