Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc9c99fa

Browse files
committed
fix formatting for zero precision zero value
1 parent004336d commitc9c99fa

File tree

3 files changed

+76
-21
lines changed

3 files changed

+76
-21
lines changed

‎src/uu/numfmt/src/options.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ impl FromStr for FormatOptions {
223223
}
224224

225225
if precision.is_empty(){
226-
options.precision =Some(0);
226+
options.precision =None;
227227
}elseifletOk(p) = precision.parse(){
228228
options.precision =Some(p);
229229
}else{

‎src/uucore/src/lib/features/format/num_format.rs

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ pub enum NumberAlignment {
7373

7474
pubstructSignedInt{
7575
pubwidth:usize,
76-
pubprecision:usize,
76+
pubprecision:Option<usize>,
7777
pubpositive_sign:PositiveSign,
7878
pubalignment:NumberAlignment,
7979
}
@@ -82,8 +82,14 @@ impl Formatter<i64> for SignedInt {
8282
fnfmt(&self,writer:implWrite,x:i64) -> std::io::Result<()>{
8383
// -i64::MIN is actually 1 larger than i64::MAX, so we need to cast to i128 first.
8484
let abs =(xasi128).abs();
85-
let s =ifself.precision >0{
86-
format!("{abs:0>width$}", width =self.precision)
85+
let s =ifletSome(prec) =self.precision{
86+
if prec >0{
87+
format!("{abs:0>width$}", width = prec)
88+
}elseif abs ==0{
89+
String::from("")
90+
}else{
91+
abs.to_string()
92+
}
8793
}else{
8894
abs.to_string()
8995
};
@@ -112,8 +118,8 @@ impl Formatter<i64> for SignedInt {
112118
};
113119

114120
let precision =match precision{
115-
Some(CanAsterisk::Fixed(x)) =>x,
116-
None =>0,
121+
Some(CanAsterisk::Fixed(x)) =>Some(x),
122+
None =>None,
117123
Some(CanAsterisk::Asterisk(_)) =>returnErr(FormatError::WrongSpecType),
118124
};
119125

@@ -129,12 +135,12 @@ impl Formatter<i64> for SignedInt {
129135
pubstructUnsignedInt{
130136
pubvariant:UnsignedIntVariant,
131137
pubwidth:usize,
132-
pubprecision:usize,
138+
pubprecision:Option<usize>,
133139
pubalignment:NumberAlignment,
134140
}
135141

136142
implFormatter<u64>forUnsignedInt{
137-
fnfmt(&self,writer:implWrite,x:u64) -> std::io::Result<()>{
143+
fnfmt(&self,mutwriter:implWrite,x:u64) -> std::io::Result<()>{
138144
letmut s =matchself.variant{
139145
UnsignedIntVariant::Decimal =>format!("{x}"),
140146
UnsignedIntVariant::Octal(_) =>format!("{x:o}"),
@@ -149,11 +155,27 @@ impl Formatter<u64> for UnsignedInt {
149155
let prefix =match(x,self.variant){
150156
(1..,UnsignedIntVariant::Hexadecimal(Case::Lowercase,Prefix::Yes)) =>"0x",
151157
(1..,UnsignedIntVariant::Hexadecimal(Case::Uppercase,Prefix::Yes)) =>"0X",
152-
(1..,UnsignedIntVariant::Octal(Prefix::Yes))if s.len() >=self.precision =>"0",
158+
(1..,UnsignedIntVariant::Octal(Prefix::Yes))
159+
if s.len() >=self.precision.unwrap_or(0) =>
160+
{
161+
"0"
162+
}
153163
_ =>"",
154164
};
155165

156-
s =format!("{prefix}{s:0>width$}", width =self.precision);
166+
ifletSome(prec) =self.precision{
167+
if prec ==0 && x ==0{
168+
s =matchself.variant{
169+
UnsignedIntVariant::Octal(Prefix::Yes) =>String::from("0"),
170+
_ =>String::from(""),
171+
};
172+
}else{
173+
s =format!("{prefix}{s:0>width$}", width = prec);
174+
}
175+
}else{
176+
s =format!("{prefix}{s:0>width$}", width =0);
177+
}
178+
157179
write_output(writer,String::new(), s,self.width,self.alignment)
158180
}
159181

@@ -196,8 +218,8 @@ impl Formatter<u64> for UnsignedInt {
196218
};
197219

198220
let precision =match precision{
199-
Some(CanAsterisk::Fixed(x)) =>x,
200-
None =>0,
221+
Some(CanAsterisk::Fixed(x)) =>Some(x),
222+
None =>None,
201223
Some(CanAsterisk::Asterisk(_)) =>returnErr(FormatError::WrongSpecType),
202224
};
203225

@@ -726,7 +748,7 @@ mod test {
726748
UnsignedInt{
727749
variant:UnsignedIntVariant::Octal(Prefix::Yes),
728750
width:0,
729-
precision:0,
751+
precision:Some(0),
730752
alignment:NumberAlignment::Left,
731753
}
732754
.fmt(&mut s, x)
@@ -1165,12 +1187,41 @@ mod test {
11651187
}
11661188

11671189
#[test]
1168-
#[ignore ="Need issue #7509 to be fixed"]
11691190
fnformat_signed_int_precision_zero(){
11701191
let format =Format::<SignedInt,i64>::parse("%.0d").unwrap();
11711192
assert_eq!(fmt(&format,123i64),"123");
11721193
// From cppreference.com: "If both the converted value and the precision are ​0​ the conversion results in no characters."
11731194
assert_eq!(fmt(&format,0i64),"");
1195+
1196+
let format_plus =Format::<SignedInt,i64>::parse("%+.0d\n").unwrap();
1197+
assert_eq!(fmt(&format_plus,0i64),"+\n");
1198+
1199+
let format_pad =Format::<SignedInt,i64>::parse("X%6.0dX").unwrap();
1200+
assert_eq!(fmt(&format_pad,0i64),"X X");
1201+
}
1202+
1203+
#[test]
1204+
fnformat_unsigned_int_precision_zero(){
1205+
let format =Format::<UnsignedInt,u64>::parse("%.0u").unwrap();
1206+
assert_eq!(fmt(&format,123u64),"123");
1207+
// From cppreference.com: "If both the converted value and the precision are ​0​ the conversion results in no characters."
1208+
assert_eq!(fmt(&format,0u64),"");
1209+
1210+
let format_norm =Format::<UnsignedInt,u64>::parse("%u").unwrap();
1211+
assert_eq!(fmt(&format_norm,123u64),"123");
1212+
assert_eq!(fmt(&format_norm,0u64),"0");
1213+
1214+
let format_pad =Format::<UnsignedInt,u64>::parse("X%6.0uX").unwrap();
1215+
assert_eq!(fmt(&format_pad,0u64),"X X");
1216+
1217+
let format_oct =Format::<UnsignedInt,u64>::parse("%#.0o").unwrap();
1218+
assert_eq!(fmt(&format_oct,0u64),"0");
1219+
1220+
let format_pad_oct =Format::<UnsignedInt,u64>::parse("X%#6.0oX").unwrap();
1221+
assert_eq!(fmt(&format_pad_oct,0u64),"X 0X");
1222+
1223+
let format_hex =Format::<UnsignedInt,u64>::parse("%#.0x").unwrap();
1224+
assert_eq!(fmt(&format_hex,0u64),"");
11741225
}
11751226

11761227
#[test]
@@ -1192,7 +1243,7 @@ mod test {
11921243
}
11931244

11941245
#[test]
1195-
#[ignore ="Need issues #7509 and #7510 to be fixed"]
1246+
#[ignore ="Needs issue #7510 to be fixed"]
11961247
fnformat_unsigned_int_broken(){
11971248
// TODO: Merge this back into format_unsigned_int.
11981249
let f = |fmt_str:&str,n:u64|{

‎src/uucore/src/lib/features/format/spec.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -418,11 +418,13 @@ impl Spec {
418418
position,
419419
} =>{
420420
let(width, neg_width) =resolve_asterisk_width(*width, args).unwrap_or((0,false));
421-
let precision =resolve_asterisk_precision(*precision, args).unwrap_or_default();
421+
let precision =resolve_asterisk_precision(*precision, args);
422422
let i = args.next_i64(position);
423423

424-
if precisionasu64 > i32::MAXasu64{
425-
returnErr(FormatError::InvalidPrecision(precision.to_string()));
424+
ifletSome(prec) = precision{
425+
if precasu64 > i32::MAXasu64{
426+
returnErr(FormatError::InvalidPrecision(prec.to_string()));
427+
}
426428
}
427429

428430
num_format::SignedInt{
@@ -446,11 +448,13 @@ impl Spec {
446448
position,
447449
} =>{
448450
let(width, neg_width) =resolve_asterisk_width(*width, args).unwrap_or((0,false));
449-
let precision =resolve_asterisk_precision(*precision, args).unwrap_or_default();
451+
let precision =resolve_asterisk_precision(*precision, args);
450452
let i = args.next_u64(position);
451453

452-
if precisionasu64 > i32::MAXasu64{
453-
returnErr(FormatError::InvalidPrecision(precision.to_string()));
454+
ifletSome(prec) = precision{
455+
if precasu64 > i32::MAXasu64{
456+
returnErr(FormatError::InvalidPrecision(prec.to_string()));
457+
}
454458
}
455459

456460
num_format::UnsignedInt{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp