@@ -451,13 +451,13 @@ mod RT {
451
451
ret _str. unsafe_from_bytes ( svec) ;
452
452
}
453
453
454
- tag pad_type {
454
+ tag pad_mode {
455
455
pad_signed;
456
456
pad_unsigned;
457
457
pad_nozero;
458
458
}
459
459
460
- fn pad ( & conv cv, str s, pad_type pt ) -> str {
460
+ fn pad ( & conv cv, str s, pad_mode mode ) -> str {
461
461
auto uwidth;
462
462
alt ( cv. width ) {
463
463
case ( count_implied) {
@@ -479,44 +479,59 @@ mod RT {
479
479
if ( have_flag ( cv. flags , flag_left_justify) ) {
480
480
auto padstr = str_init_elt ( padchar, diff) ;
481
481
ret s + padstr;
482
- } else {
483
- auto zero_padding = false ;
484
- auto signed = false ;
485
- alt ( pt) {
486
- case ( pad_nozero) {
487
- // fallthrough
488
- }
489
- case ( pad_signed) {
490
- signed = true ;
491
- if ( have_flag ( cv. flags , flag_left_zero_pad) ) {
492
- padchar = '0' ;
493
- zero_padding = true ;
494
- }
482
+ }
483
+
484
+ auto might_zero_pad = false ;
485
+ auto signed = false ;
486
+
487
+ alt ( mode) {
488
+ case ( pad_nozero) {
489
+ // fallthrough
490
+ }
491
+ case ( pad_signed) {
492
+ might_zero_pad = true ;
493
+ signed = true ;
494
+ }
495
+ case ( pad_unsigned) {
496
+ might_zero_pad = true ;
497
+ }
498
+ }
499
+
500
+ fn have_precision ( & conv cv) -> bool {
501
+ alt ( cv. precision ) {
502
+ case ( count_implied) {
503
+ ret false ;
495
504
}
496
- case ( pad_unsigned) {
497
- if ( have_flag ( cv. flags , flag_left_zero_pad) ) {
498
- padchar = '0' ;
499
- zero_padding = true ;
500
- }
505
+ case ( _) {
506
+ ret true ;
501
507
}
502
508
}
509
+ }
503
510
504
- auto padstr = str_init_elt ( padchar, diff) ;
511
+ auto zero_padding = false ;
512
+ if ( might_zero_pad
513
+ && have_flag ( cv. flags , flag_left_zero_pad)
514
+ && !have_precision ( cv) ) {
505
515
506
- // This is completely heinous. If we have a signed value then
507
- // potentially rip apart the intermediate result and insert some
508
- // zeros. It may make sense to convert zero padding to a precision
509
- // instead.
510
- if ( signed
511
- && zero_padding
512
- && _str. byte_len ( s) > 0 u
513
- && s. ( 0 ) == '-' as u8 ) {
514
-
515
- auto bytelen = _str. byte_len ( s) ;
516
- auto numpart = _str. substr ( s, 1 u, bytelen - 1 u) ;
517
- ret "-" + padstr + numpart;
518
- }
516
+ padchar = '0' ;
517
+ zero_padding = true ;
518
+ }
519
+
520
+ auto padstr = str_init_elt ( padchar, diff) ;
519
521
522
+ // This is completely heinous. If we have a signed value then
523
+ // potentially rip apart the intermediate result and insert some
524
+ // zeros. It may make sense to convert zero padding to a precision
525
+ // instead.
526
+ if ( signed
527
+ && zero_padding
528
+ && _str. byte_len ( s) > 0 u
529
+ && s. ( 0 ) == '-' as u8 ) {
530
+
531
+ auto bytelen = _str. byte_len ( s) ;
532
+ auto numpart = _str. substr ( s, 1 u, bytelen - 1 u) ;
533
+ ret "-" + padstr + numpart;
534
+ } else {
520
535
ret padstr + s;
521
536
}
522
537
}
0 commit comments