Index: libc/generic/io/print.c
===================================================================
--- libc/generic/io/print.c	(revision 34c4d691d69bded69c4c1d3527d7605c5c121433)
+++ libc/generic/io/print.c	(revision cdafab15602712d479cd0b4f0e3c5d73005f5958)
@@ -166,5 +166,6 @@
 	char d[PRINT_NUMBER_BUFFER_SIZE];	/* this is good enough even for base == 2, prefix and sign */
 	char *ptr = &d[PRINT_NUMBER_BUFFER_SIZE - 1];
-	int size = 0;
+	int size = 0; /* size of number with all prefixes and signs */
+	int number_size; /* size of plain number */
 	int written = 0;
 	char sgn;
@@ -184,5 +185,7 @@
 		} while (num /= base);
 	}
-
+	
+	number_size = size;
+	
 	/* Collect sum of all prefixes/signs/... to calculate padding and leading zeroes */
 	if (flags & __PRINTF_FLAG_PREFIX) {
@@ -221,13 +224,13 @@
 	if (flags & __PRINTF_FLAG_ZEROPADDED) {
 		if ((precision == 0) && (width > size)) {
-			precision = width - size;
+			precision = width - size + number_size;
 		}
 	}
 
 	/* print leading spaces */
-	if (size > precision) /* We must print whole number not only a part */
-		precision = size;
-
-	width -= precision;
+	if (number_size > precision) /* We must print whole number not only a part */
+		precision = number_size;
+
+	width -= precision + size - number_size;
 	
 	if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) {
@@ -274,5 +277,5 @@
 
 	/* print leading zeroes */
-	precision -= size;
+	precision -= number_size;
 	while (precision-- > 0) { 	
 		putchar('0');	
