From f81a49e464c2899710b3ed1f402434f83d92d094 Mon Sep 17 00:00:00 2001
From: Dave Hylands <dhylands@gmail.com>
Date: Sat, 5 Apr 2014 08:21:45 -0700
Subject: [PATCH] Allow floating point arguments with %d,i,u,o,x,X formats

---
 py/objstr.c                          | 17 +++++++++++++----
 tests/basics/string-format-modulo.py | 19 +++++++++++++++++++
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/py/objstr.c b/py/objstr.c
index 74f993a0b..ad85b4b6c 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -528,6 +528,15 @@ static bool arg_looks_numeric(mp_obj_t arg) {
     ;
 }
 
+static machine_int_t arg_as_int(mp_obj_t arg) {
+#if MICROPY_ENABLE_FLOAT
+    if (MP_OBJ_IS_TYPE(arg, &mp_type_float)) {
+        return mp_obj_get_float(arg);
+    }
+#endif
+    return mp_obj_get_int(arg);
+}
+
 mp_obj_t str_format(uint n_args, const mp_obj_t *args) {
     assert(MP_OBJ_IS_STR(args[0]));
 
@@ -991,7 +1000,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t
             case 'd':
             case 'i':
             case 'u':
-                pfenv_print_int(&pfenv_vstr, mp_obj_get_int(arg), 1, 10, 'a', flags, fill, width);
+                pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 10, 'a', flags, fill, width);
                 break;
 
 #if MICROPY_ENABLE_FLOAT
@@ -1009,7 +1018,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t
                 if (alt) {
                     flags |= PF_FLAG_SHOW_PREFIX;
                 }
-                pfenv_print_int(&pfenv_vstr, mp_obj_get_int(arg), 1, 8, 'a', flags, fill, width); 
+                pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 8, 'a', flags, fill, width); 
                 break;
 
             case 'r':
@@ -1034,14 +1043,14 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t
                 if (alt) {
                     flags |= PF_FLAG_SHOW_PREFIX;
                 }
-                pfenv_print_int(&pfenv_vstr, mp_obj_get_int(arg), 1, 16, 'a', flags, fill, width);
+                pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'a', flags, fill, width);
                 break;
 
             case 'X':
                 if (alt) {
                     flags |= PF_FLAG_SHOW_PREFIX;
                 }
-                pfenv_print_int(&pfenv_vstr, mp_obj_get_int(arg), 1, 16, 'A', flags, fill, width);
+                pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'A', flags, fill, width);
                 break;
             
             default:
diff --git a/tests/basics/string-format-modulo.py b/tests/basics/string-format-modulo.py
index 82cbdddc7..b736e2a73 100644
--- a/tests/basics/string-format-modulo.py
+++ b/tests/basics/string-format-modulo.py
@@ -21,6 +21,14 @@ try:
 except TypeError:
     print("TypeError")
 
+print("%s" % True)
+print("%s" % 1)
+print("%s" % 1.0)
+
+print("%r" % True)
+print("%r" % 1)
+print("%r" % 1.0)
+
 print("%c" % 48)
 print("%c" % 'a')
 print("%10s" % 'abc')
@@ -29,9 +37,20 @@ print("%d" % 10)
 print("%+d" % 10)
 print("% d" % 10)
 print("%d" % -10)
+print("%d" % 1.0)
+print("%d" % True)
+print("%i" % -10)
+print("%i" % 1.0)
+print("%i" % True)
+print("%u" % -10)
+print("%u" % 1.0)
+print("%u" % True)
 print("%x" % 18)
+print("%x" % 18.0)
 print("%o" % 18)
+print("%o" % 18.0)
 print("%X" % 18)
+print("%X" % 18.0)
 print("%#x" % 18)
 print("%#X" % 18)
 print("%#6x" % 18)
-- 
GitLab