use Py_CHARMASK; and don't check for neg. float to the float power here
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index d9366ae..7df894e 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -749,10 +749,10 @@
 				if (--fmtcnt >= 0)
 					c = *fmt++;
 			}
-			else if (isdigit(c)) {
+			else if (c >= 0 && isdigit(c)) {
 				width = c - '0';
 				while (--fmtcnt >= 0) {
-					c = *fmt++;
+					c = Py_CHARMASK(*fmt++);
 					if (!isdigit(c))
 						break;
 					if ((width*10) / 10 != width) {
@@ -782,10 +782,10 @@
 					if (--fmtcnt >= 0)
 						c = *fmt++;
 				}
-				else if (isdigit(c)) {
+				else if (c >= 0 && isdigit(c)) {
 					prec = c - '0';
 					while (--fmtcnt >= 0) {
-						c = *fmt++;
+						c = Py_CHARMASK(*fmt++);
 						if (!isdigit(c))
 							break;
 						if ((prec*10) / 10 != prec) {
@@ -913,7 +913,7 @@
 				--rescnt;
 				*res++ = ' ';
 			}
-                        if (dict && (argidx < arglen)) {
+                        if (dict && (argidx < arglen) && c != '%') {
                                 err_setstr(TypeError,
                                            "not all arguments converted");
                                 goto error;