@@ -92,6 +92,18 @@ bitflags! {
92
92
}
93
93
}
94
94
95
+ impl CConversionFlags {
96
+ fn sign_string ( & self ) -> & ' static str {
97
+ if self . contains ( CConversionFlags :: SIGN_CHAR ) {
98
+ "+"
99
+ } else if self . contains ( CConversionFlags :: BLANK_SIGN ) {
100
+ " "
101
+ } else {
102
+ ""
103
+ }
104
+ }
105
+ }
106
+
95
107
#[ derive( Debug , PartialEq ) ]
96
108
enum CFormatQuantity {
97
109
Amount ( usize ) ,
@@ -198,46 +210,37 @@ impl CFormatSpec {
198
210
199
211
let sign_string = match num. sign ( ) {
200
212
Sign :: Minus => "-" ,
201
- _ => {
202
- if self . flags . contains ( CConversionFlags :: SIGN_CHAR ) {
203
- "+"
204
- } else if self . flags . contains ( CConversionFlags :: BLANK_SIGN ) {
205
- " "
206
- } else {
207
- ""
208
- }
209
- }
213
+ _ => self . flags . sign_string ( ) ,
210
214
} ;
211
215
212
- let prefix = format ! ( "{}{}" , sign_string, prefix) ;
213
-
214
216
if self . flags . contains ( CConversionFlags :: ZERO_PAD ) {
215
217
let fill_char = if !self . flags . contains ( CConversionFlags :: LEFT_ADJUST ) {
216
218
'0'
217
219
} else {
218
220
' ' // '-' overrides the '0' conversion if both are given
219
221
} ;
222
+ let signed_prefix = format ! ( "{}{}" , sign_string, prefix) ;
220
223
format ! (
221
224
"{}{}" ,
222
- prefix,
223
- self . fill_string( magnitude_string, fill_char, Some ( prefix. chars( ) . count( ) ) )
225
+ signed_prefix,
226
+ self . fill_string(
227
+ magnitude_string,
228
+ fill_char,
229
+ Some ( signed_prefix. chars( ) . count( ) )
230
+ )
224
231
)
225
232
} else {
226
- self . fill_string ( format ! ( "{}{}" , prefix, magnitude_string) , ' ' , None )
233
+ self . fill_string (
234
+ format ! ( "{}{}{}" , sign_string, prefix, magnitude_string) ,
235
+ ' ' ,
236
+ None ,
237
+ )
227
238
}
228
239
}
229
240
230
241
pub ( crate ) fn format_float ( & self , num : f64 ) -> Result < String , String > {
231
- let magnitude = num. abs ( ) ;
232
-
233
242
let sign_string = if num. is_sign_positive ( ) {
234
- if self . flags . contains ( CConversionFlags :: SIGN_CHAR ) {
235
- "+"
236
- } else if self . flags . contains ( CConversionFlags :: BLANK_SIGN ) {
237
- " "
238
- } else {
239
- ""
240
- }
243
+ self . flags . sign_string ( )
241
244
} else {
242
245
"-"
243
246
} ;
@@ -248,6 +251,7 @@ impl CFormatSpec {
248
251
Some ( CFormatQuantity :: Amount ( p) ) => p,
249
252
_ => 6 ,
250
253
} ;
254
+ let magnitude = num. abs ( ) ;
251
255
format ! ( "{:.*}" , precision, magnitude)
252
256
}
253
257
CFormatType :: Float ( CFloatType :: Exponent ( _) ) => {
@@ -308,10 +312,8 @@ impl CFormatSpec {
308
312
}
309
313
Ok ( self . format_number ( objint:: get_value ( & obj) ) )
310
314
}
311
- CFormatType :: Float ( _) => if objtype:: isinstance ( & obj, & vm. ctx . types . float_type ) {
312
- self . format_float ( objfloat:: get_value ( & obj) )
313
- } else if objtype:: isinstance ( & obj, & vm. ctx . types . int_type ) {
314
- self . format_float ( objint:: get_value ( & obj) . to_f64 ( ) . unwrap ( ) )
315
+ CFormatType :: Float ( _) => if let Some ( value) = objfloat:: try_float ( & obj, vm) ? {
316
+ self . format_float ( value)
315
317
} else {
316
318
let required_type_string = "an floating point or integer" ;
317
319
return Err ( vm. new_type_error ( format ! (
@@ -326,16 +328,12 @@ impl CFormatSpec {
326
328
let ch = {
327
329
if objtype:: isinstance ( & obj, & vm. ctx . types . int_type ) {
328
330
// BigInt truncation is fine in this case because only the unicode range is relevant
329
- match objint:: get_value ( & obj)
331
+ objint:: get_value ( & obj)
330
332
. to_u32 ( )
331
333
. and_then ( std:: char:: from_u32)
332
- {
333
- Some ( value) => Ok ( value) ,
334
- None => {
335
- Err ( vm
336
- . new_overflow_error ( "%c arg not in range(0x110000)" . to_owned ( ) ) )
337
- }
338
- }
334
+ . ok_or_else ( || {
335
+ vm. new_overflow_error ( "%c arg not in range(0x110000)" . to_owned ( ) )
336
+ } )
339
337
} else if objtype:: isinstance ( & obj, & vm. ctx . types . str_type ) {
340
338
let s = objstr:: borrow_value ( & obj) ;
341
339
let num_chars = s. chars ( ) . count ( ) ;
0 commit comments