diff --git a/pkg/members/members.go b/pkg/members/members.go
index 4e153058c5004bdb13dd5a0b548abdf311ac49c8..77d5b1c4ff46e0c664e3c1dca6b9313e5e1aa452 100644
--- a/pkg/members/members.go
+++ b/pkg/members/members.go
@@ -2,6 +2,7 @@ package members
 
 import (
 	"fmt"
+	"strconv"
 )
 
 type Member struct {
@@ -24,7 +25,12 @@ func (r Role) IsPrivileged() bool {
 }
 
 func (r Role) Format(s fmt.State, verb rune) {
-	s.Write([]byte(r.String()))
+	switch verb {
+	case 's':
+		s.Write([]byte(r.String()))
+	default:
+		s.Write([]byte(strconv.Itoa(int(r))))
+	}
 }
 
 func (r Role) String() string {
diff --git a/pkg/members/members_test.go b/pkg/members/members_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..4343b75e17b4d91743f1faf3e69bdce81851e03c
--- /dev/null
+++ b/pkg/members/members_test.go
@@ -0,0 +1,65 @@
+package members
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestFormat(t *testing.T) {
+	tests := []struct {
+		name     string
+		template string
+		want     string
+		role     Role
+	}{
+		{
+			name:     "NotMember with %s",
+			template: "%s",
+			role:     NotMember,
+			want:     "not member",
+		},
+		{
+			name:     "RoleMember with %s",
+			role:     RoleMember,
+			template: "%s",
+			want:     "member",
+		},
+		{
+			name:     "RoleOwner with %s",
+			role:     RoleOwner,
+			template: "%s",
+			want:     "owner",
+		},
+		{
+			name:     "RoleAdmin with %s",
+			role:     RoleAdmin,
+			template: "%s",
+			want:     "admin",
+		},
+		{
+			name:     "Existent role with %d",
+			role:     RoleAdmin,
+			template: "%d",
+			want:     "3",
+		},
+		{
+			name:     "Non-existent role with %s",
+			role:     4,
+			template: "%s",
+			want:     "4",
+		},
+		{
+			name:     "Non-existent role with %d",
+			role:     4,
+			template: "%d",
+			want:     "4",
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			require.Equal(t, tt.want, fmt.Sprintf(tt.template, tt.role))
+		})
+	}
+}