@@ -676,6 +676,16 @@ def test__format__(self):
676676 self .assertEqual (format (123456789 , ',' ), '123,456,789' )
677677 self .assertEqual (format (123456789 , '_' ), '123_456_789' )
678678
679+ ## precision
680+ self .assertEqual (format (0 , '.0' ), '0' )
681+ self .assertEqual (format (67 , '2.3' ), '067' )
682+ self .assertEqual (format (67 , '8.3' ), ' 067' )
683+ self .assertEqual (format (67 , ' .3' ), ' 067' )
684+
685+ with self .assertRaises (ValueError ):
686+ format (123 , ".2147483648" )
687+ # too large
688+
679689 # sign and aligning are interdependent
680690 self .assertEqual (format (1 , "-" ), '1' )
681691 self .assertEqual (format (- 1 , "-" ), '-1' )
@@ -707,6 +717,23 @@ def test__format__(self):
707717 self .assertEqual (format (1234567890 , '_x' ), '4996_02d2' )
708718 self .assertEqual (format (1234567890 , '_X' ), '4996_02D2' )
709719
720+ ## precision
721+ self .assertEqual (format (10 , '#.2x' ), '0x0a' )
722+ self .assertEqual (format (21 , '#.4x' ), '0x0015' )
723+ self .assertEqual (format (8086 , '#.4x' ), '0x1f96' )
724+ self .assertEqual (format (314159 , '#.4x' ), '0x4cb2f' )
725+ self .assertEqual (format (- 21 , '#.4x' ), '-0x0015' )
726+ self .assertEqual (format (- 8086 , '#.4x' ), '-0x1f96' )
727+ self .assertEqual (format (- 314159 , '#.4x' ), '-0x4cb2f' )
728+
729+ ## modulo / two's complement wrap
730+ self .assertEqual (format (- 129 , 'z#.2x' ), '0x7f' )
731+ self .assertEqual (format (127 , 'z#.2x' ), '0x7f' )
732+ self .assertEqual (format (383 , 'z#.2x' ), '0x7f' )
733+ self .assertEqual (format (- 1 , 'z#.2x' ), '0xff' )
734+ self .assertEqual (format (255 , 'z#.2x' ), '0xff' )
735+ self .assertEqual (format (10 , 'z#.2x' ), '0x0a' )
736+
710737 # octal
711738 self .assertEqual (format (3 , "o" ), "3" )
712739 self .assertEqual (format (- 3 , "o" ), "-3" )
@@ -721,6 +748,18 @@ def test__format__(self):
721748 self .assertRaises (ValueError , format , 1234567890 , ',o' )
722749 self .assertEqual (format (1234567890 , '_o' ), '111_4540_1322' )
723750
751+ ## precision
752+ self .assertEqual (format (18 , '#.3o' ), '0o022' )
753+ self .assertEqual (format (256 , 'z.3o' ), '400' )
754+ self .assertEqual (format (64 , 'z.2o' ), '00' )
755+ self .assertEqual (format (- 257 , 'z.3o' ), '377' )
756+
757+ self .assertEqual (format (- 1 , 'z.3o' ), '777' )
758+ # different from C `printf("%hho\n", -1);` which is '377'
759+ # because hh is 8 bits, not divisible by 3, the number of
760+ # bits per octal digit, whereas Python has unlimited precision
761+ # and we request 9 bits (3 bits per octal digit * 3 digits)
762+
724763 # binary
725764 self .assertEqual (format (3 , "b" ), "11" )
726765 self .assertEqual (format (- 3 , "b" ), "-11" )
@@ -735,6 +774,27 @@ def test__format__(self):
735774 self .assertRaises (ValueError , format , 1234567890 , ',b' )
736775 self .assertEqual (format (12345 , '_b' ), '11_0000_0011_1001' )
737776
777+ ## precision
778+ self .assertEqual (format ( 1 , '#.8b' ), "0b00000001" )
779+ self .assertEqual (format (- 1 , '#.8b' ), "-0b00000001" )
780+ self .assertEqual (format (127 , '#.8b' ), "0b01111111" )
781+ self .assertEqual (format (128 , '#.8b' ), "0b10000000" )
782+ self .assertEqual (format (129 , '#.8b' ), "0b10000001" )
783+ self .assertEqual (format (301 , '#.8b' ), "0b100101101" )
784+ self .assertEqual (format ( 15 , ' #.8b' ), " 0b00001111" )
785+ self .assertEqual (format ( 15 , '+#.8b' ), "+0b00001111" )
786+ self .assertEqual (format (- 15 , ' #.8b' ), "-0b00001111" )
787+
788+ ## modulo / two's complement wrap
789+ self .assertEqual (format (- 129 , 'z#.8b' ), '0b01111111' )
790+ self .assertEqual (format (127 , 'z#.8b' ), '0b01111111' )
791+ self .assertEqual (format (383 , 'z#.8b' ), '0b01111111' )
792+ self .assertEqual (format (- 1 , 'z#.8b' ), '0b11111111' )
793+ self .assertEqual (format (255 , 'z#.8b' ), '0b11111111' )
794+ self .assertEqual (format (10 , 'z#.8b' ), '0b00001010' )
795+ self .assertEqual (format (600 , ' z#8.8b' ), ' 0b01011000' )
796+ self .assertEqual (format (600 , ' z#12.8b' ), ' 0b01011000' )
797+
738798 # make sure these are errors for 'c' presentation type
739799 self .assertRaises (ValueError , format , 3 , ".3c" ) # precision,
740800 self .assertRaises (ValueError , format , 3 , "zc" ) # two's complement,
0 commit comments