git.delta.rocks / jrsonnet / refs/commits / e8ba76475de8

difftreelog

fix int rendering in format should operate floats

Yaroslav Bolyukin2022-10-11parent: #097494e.patch.diff
in: master

1 file changed

modifiedcrates/jrsonnet-evaluator/src/stdlib/format.rsdiffbeforeafterboth
285#[inline]285#[inline]
286pub fn render_integer(286pub fn render_integer(
287 out: &mut String,287 out: &mut String,
288 iv: i64,288 iv: f64,
289 padding: usize,289 padding: usize,
290 precision: usize,290 precision: usize,
291 blank: bool,291 blank: bool,
294 prefix: &str,294 prefix: &str,
295 caps: bool,295 caps: bool,
296) {296) {
297 let radix = radix as f64;
298 let iv = iv.floor();
297 // Digit char indexes in reverse order, i.e299 // Digit char indexes in reverse order, i.e
298 // for radix = 16 and n = 12f: [15, 2, 1]300 // for radix = 16 and n = 12f: [15, 2, 1]
299 let digits = if iv == 0 {301 let digits = if iv == 0.0 {
300 vec![0u8]302 vec![0u8]
301 } else {303 } else {
302 let mut v = iv.abs();304 let mut v = iv.abs();
303 let mut nums = Vec::with_capacity(1);305 let mut nums = Vec::with_capacity(1);
304 while v > 0 {306 while v != 0.0 {
305 nums.push((v % radix) as u8);307 nums.push((v % radix) as u8);
306 v /= radix;308 v = (v / radix).floor();
307 }309 }
308 nums310 nums
309 };311 };
310 let neg = iv < 0;312 let neg = iv < 0.0;
311 let zp = padding.saturating_sub(if neg || blank || sign { 1 } else { 0 });313 let zp = padding.saturating_sub(if neg || blank || sign { 1 } else { 0 });
312 let zp2 = zp314 let zp2 = zp
313 .max(precision)315 .max(precision)
335337
336pub fn render_decimal(338pub fn render_decimal(
337 out: &mut String,339 out: &mut String,
338 iv: i64,340 iv: f64,
339 padding: usize,341 padding: usize,
340 precision: usize,342 precision: usize,
341 blank: bool,343 blank: bool,
345}347}
346pub fn render_octal(348pub fn render_octal(
347 out: &mut String,349 out: &mut String,
348 iv: i64,350 iv: f64,
349 padding: usize,351 padding: usize,
350 precision: usize,352 precision: usize,
351 alt: bool,353 alt: bool,
360 blank,362 blank,
361 sign,363 sign,
362 8,364 8,
363 if alt && iv != 0 { "0" } else { "" },365 if alt && iv != 0.0 { "0" } else { "" },
364 false,366 false,
365 );367 );
366}368}
367369
368#[allow(clippy::fn_params_excessive_bools)]370#[allow(clippy::fn_params_excessive_bools)]
369pub fn render_hexadecimal(371pub fn render_hexadecimal(
370 out: &mut String,372 out: &mut String,
371 iv: i64,373 iv: f64,
372 padding: usize,374 padding: usize,
373 precision: usize,375 precision: usize,
374 alt: bool,376 alt: bool,
406) {408) {
407 let dot_size = if precision == 0 && !ensure_pt { 0 } else { 1 };409 let dot_size = if precision == 0 && !ensure_pt { 0 } else { 1 };
408 padding = padding.saturating_sub(dot_size + precision);410 padding = padding.saturating_sub(dot_size + precision);
409 render_decimal(out, n.floor() as i64, padding, 0, blank, sign);411 render_decimal(out, n.floor(), padding, 0, blank, sign);
410 if precision == 0 {412 if precision == 0 {
411 if ensure_pt {413 if ensure_pt {
412 out.push('.');414 out.push('.');
420 if trailing || frac > 0.0 {422 if trailing || frac > 0.0 {
421 out.push('.');423 out.push('.');
422 let mut frac_str = String::new();424 let mut frac_str = String::new();
423 render_decimal(&mut frac_str, frac as i64, precision, 0, false, false);425 render_decimal(&mut frac_str, frac, precision, 0, false, false);
424 let mut trim = frac_str.len();426 let mut trim = frac_str.len();
425 if !trailing {427 if !trailing {
426 for b in frac_str.as_bytes().iter().rev() {428 for b in frac_str.as_bytes().iter().rev() {
454 n / 10.0_f64.powf(exponent)456 n / 10.0_f64.powf(exponent)
455 };457 };
456 let mut exponent_str = String::new();458 let mut exponent_str = String::new();
457 render_decimal(&mut exponent_str, exponent as i64, 3, 0, false, true);459 render_decimal(&mut exponent_str, exponent, 3, 0, false, true);
458460
459 // +1 for e461 // +1 for e
460 padding = padding.saturating_sub(exponent_str.len() + 1);462 padding = padding.saturating_sub(exponent_str.len() + 1);
495 let value = f64::from_untyped(value.clone(), s)?;497 let value = f64::from_untyped(value.clone(), s)?;
496 render_decimal(498 render_decimal(
497 &mut tmp_out,499 &mut tmp_out,
498 value as i64,500 value,
499 padding,501 padding,
500 iprec,502 iprec,
501 clfags.blank,503 clfags.blank,
506 let value = f64::from_untyped(value.clone(), s)?;508 let value = f64::from_untyped(value.clone(), s)?;
507 render_octal(509 render_octal(
508 &mut tmp_out,510 &mut tmp_out,
509 value as i64,511 value,
510 padding,512 padding,
511 iprec,513 iprec,
512 clfags.alt,514 clfags.alt,
518 let value = f64::from_untyped(value.clone(), s)?;520 let value = f64::from_untyped(value.clone(), s)?;
519 render_hexadecimal(521 render_hexadecimal(
520 &mut tmp_out,522 &mut tmp_out,
521 value as i64,523 value,
522 padding,524 padding,
523 iprec,525 iprec,
524 clfags.alt,526 clfags.alt,