Issue19995: %o, %x, %X now only accept ints
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index f4df6c7..aec7009 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -196,7 +196,7 @@
     # A 0o200 byte indicates a positive number, a 0o377 byte a negative
     # number.
     if 0 <= n < 8 ** (digits - 1):
-        s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL
+        s = bytes("%0*o" % (digits - 1, int(n)), "ascii") + NUL
     elif format == GNU_FORMAT and -256 ** (digits - 1) <= n < 256 ** (digits - 1):
         if n >= 0:
             s = bytearray([0o200])
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index 29330f9..4b1fdf9 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -142,7 +142,6 @@
         testformat("%#+027.23X", big, "+0X0001234567890ABCDEF12345")
         # same, except no 0 flag
         testformat("%#+27.23X", big, " +0X001234567890ABCDEF12345")
-        testformat("%x", float(big), "123456_______________", 6)
         big = 0o12345670123456701234567012345670  # 32 octal digits
         testformat("%o", big, "12345670123456701234567012345670")
         testformat("%o", -big, "-12345670123456701234567012345670")
@@ -182,7 +181,6 @@
         testformat("%034.33o", big, "0012345670123456701234567012345670")
         # base marker shouldn't change that
         testformat("%0#34.33o", big, "0o012345670123456701234567012345670")
-        testformat("%o", float(big), "123456__________________________", 6)
         # Some small ints, in both Python int and flavors).
         testformat("%d", 42, "42")
         testformat("%d", -42, "-42")
@@ -193,7 +191,6 @@
         testformat("%#x", 1, "0x1")
         testformat("%#X", 1, "0X1")
         testformat("%#X", 1, "0X1")
-        testformat("%#x", 1.0, "0x1")
         testformat("%#o", 1, "0o1")
         testformat("%#o", 1, "0o1")
         testformat("%#o", 0, "0o0")
@@ -210,12 +207,10 @@
         testformat("%x", -0x42, "-42")
         testformat("%x", 0x42, "42")
         testformat("%x", -0x42, "-42")
-        testformat("%x", float(0x42), "42")
         testformat("%o", 0o42, "42")
         testformat("%o", -0o42, "-42")
         testformat("%o", 0o42, "42")
         testformat("%o", -0o42, "-42")
-        testformat("%o", float(0o42), "42")
         testformat("%r", "\u0378", "'\\u0378'")  # non printable
         testformat("%a", "\u0378", "'\\u0378'")  # non printable
         testformat("%r", "\u0374", "'\u0374'")   # printable
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index c0d5dae..f64a962 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -1126,6 +1126,35 @@
         self.assertEqual('%.1s' % "a\xe9\u20ac", 'a')
         self.assertEqual('%.2s' % "a\xe9\u20ac", 'a\xe9')
 
+        #issue 19995
+        class PsuedoInt:
+            def __init__(self, value):
+                self.value = int(value)
+            def __int__(self):
+                return self.value
+            def __index__(self):
+                return self.value
+        class PsuedoFloat:
+            def __init__(self, value):
+                self.value = float(value)
+            def __int__(self):
+                return int(self.value)
+        pi = PsuedoFloat(3.1415)
+        letter_m = PsuedoInt(109)
+        self.assertEquals('%x' % 42, '2a')
+        self.assertEquals('%X' % 15, 'F')
+        self.assertEquals('%o' % 9, '11')
+        self.assertEquals('%c' % 109, 'm')
+        self.assertEquals('%x' % letter_m, '6d')
+        self.assertEquals('%X' % letter_m, '6D')
+        self.assertEquals('%o' % letter_m, '155')
+        self.assertEquals('%c' % letter_m, 'm')
+        self.assertRaises(TypeError, '%x'.__mod__, pi)
+        self.assertRaises(TypeError, '%x'.__mod__, 3.14)
+        self.assertRaises(TypeError, '%X'.__mod__, 2.11)
+        self.assertRaises(TypeError, '%o'.__mod__, 1.79)
+        self.assertRaises(TypeError, '%c'.__mod__, pi)
+
     def test_formatting_with_enum(self):
         # issue18780
         import enum