@@ -436,7 +436,9 @@ impl FormatSpec {
436
436
let sep = char:: from ( fg) ;
437
437
let inter = self . get_separator_interval ( ) . try_into ( ) . unwrap ( ) ;
438
438
let magnitude_len = magnitude_str. len ( ) ;
439
- let disp_digit_cnt = if self . fill == Some ( '0' . into ( ) ) {
439
+ let disp_digit_cnt = if self . fill == Some ( '0' . into ( ) )
440
+ && self . align == Some ( FormatAlign :: AfterSign )
441
+ {
440
442
let width = self . width . unwrap_or ( magnitude_len) as i32 - prefix. len ( ) as i32 ;
441
443
cmp:: max ( width, magnitude_len as i32 )
442
444
} else {
@@ -1323,6 +1325,45 @@ mod tests {
1323
1325
) ;
1324
1326
}
1325
1327
1328
+ #[ test]
1329
+ fn test_format_int_width_and_grouping ( ) {
1330
+ // issue #5922: width + comma grouping should pad left, not inside the number
1331
+ let spec = FormatSpec :: parse ( "10," ) . unwrap ( ) ;
1332
+ let result = spec. format_int ( & BigInt :: from ( 1234 ) ) . unwrap ( ) ;
1333
+ assert_eq ! ( result, " 1,234" ) ; // CPython 3.13.5
1334
+ }
1335
+
1336
+ #[ test]
1337
+ fn test_format_int_padding_with_grouping ( ) {
1338
+ // CPython behavior: f'{1234:010,}' results in "00,001,234"
1339
+ let spec1 = FormatSpec :: parse ( "010," ) . unwrap ( ) ;
1340
+ let result1 = spec1. format_int ( & BigInt :: from ( 1234 ) ) . unwrap ( ) ;
1341
+ assert_eq ! ( result1, "00,001,234" ) ;
1342
+
1343
+ // CPython behavior: f'{-1234:010,}' results in "-0,001,234"
1344
+ let spec2 = FormatSpec :: parse ( "010," ) . unwrap ( ) ;
1345
+ let result2 = spec2. format_int ( & BigInt :: from ( -1234 ) ) . unwrap ( ) ;
1346
+ assert_eq ! ( result2, "-0,001,234" ) ;
1347
+
1348
+ // CPython behavior: f'{-1234:=10,}' results in "- 1,234"
1349
+ let spec3 = FormatSpec :: parse ( "=10," ) . unwrap ( ) ;
1350
+ let result3 = spec3. format_int ( & BigInt :: from ( -1234 ) ) . unwrap ( ) ;
1351
+ assert_eq ! ( result3, "- 1,234" ) ;
1352
+
1353
+ // CPython behavior: f'{1234:=10,}' results in " 1,234" (same as right-align for positive numbers)
1354
+ let spec4 = FormatSpec :: parse ( "=10," ) . unwrap ( ) ;
1355
+ let result4 = spec4. format_int ( & BigInt :: from ( 1234 ) ) . unwrap ( ) ;
1356
+ assert_eq ! ( result4, " 1,234" ) ;
1357
+ }
1358
+
1359
+ #[ test]
1360
+ fn test_format_int_non_aftersign_zero_padding ( ) {
1361
+ // CPython behavior: f'{1234:0>10,}' results in "000001,234"
1362
+ let spec = FormatSpec :: parse ( "0>10," ) . unwrap ( ) ;
1363
+ let result = spec. format_int ( & BigInt :: from ( 1234 ) ) . unwrap ( ) ;
1364
+ assert_eq ! ( result, "000001,234" ) ;
1365
+ }
1366
+
1326
1367
#[ test]
1327
1368
fn test_format_parse ( ) {
1328
1369
let expected = Ok ( FormatString {
0 commit comments