Skip to content

Commit a47ca04

Browse files
committed
deploy: 055173b
1 parent 406d14e commit a47ca04

File tree

1 file changed

+62
-12
lines changed

1 file changed

+62
-12
lines changed

dev/src/uucore/features/tokenize/num_format/formatters/float_common.rs.html

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,31 @@
350350
<span id="348">348</span>
351351
<span id="349">349</span>
352352
<span id="350">350</span>
353+
<span id="351">351</span>
354+
<span id="352">352</span>
355+
<span id="353">353</span>
356+
<span id="354">354</span>
357+
<span id="355">355</span>
358+
<span id="356">356</span>
359+
<span id="357">357</span>
360+
<span id="358">358</span>
361+
<span id="359">359</span>
362+
<span id="360">360</span>
363+
<span id="361">361</span>
364+
<span id="362">362</span>
365+
<span id="363">363</span>
366+
<span id="364">364</span>
367+
<span id="365">365</span>
368+
<span id="366">366</span>
369+
<span id="367">367</span>
370+
<span id="368">368</span>
371+
<span id="369">369</span>
372+
<span id="370">370</span>
373+
<span id="371">371</span>
374+
<span id="372">372</span>
375+
<span id="373">373</span>
376+
<span id="374">374</span>
377+
<span id="375">375</span>
353378
</pre><pre class="rust"><code><span class="comment">// spell-checker:ignore (vars) charf decf floatf intf scif strf Cninety</span>
354379
<span class="comment">// spell-checker:ignore (ToDO) arrnum</span>
355380

@@ -505,7 +530,9 @@
505530
<span class="comment">// bumps the last digit up one,</span>
506531
<span class="comment">// and if the digit was nine</span>
507532
<span class="comment">// propagate to the next, etc.</span>
508-
<span class="kw">fn</span> <span class="ident">_round_str_from</span>(<span class="ident">in_str</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">position</span>: <span class="ident">usize</span>) -&gt; (<span class="ident">String</span>, <span class="ident">bool</span>) {
533+
<span class="comment">// If before the decimal and the most</span>
534+
<span class="comment">// significant digit is a 9, it becomes a 1</span>
535+
<span class="kw">fn</span> <span class="ident">_round_str_from</span>(<span class="ident">in_str</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">position</span>: <span class="ident">usize</span>, <span class="ident">before_dec</span>: <span class="ident">bool</span>) -&gt; (<span class="ident">String</span>, <span class="ident">bool</span>) {
509536
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">it</span> <span class="op">=</span> <span class="ident">in_str</span>[<span class="number">0</span>..<span class="ident">position</span>].<span class="ident">chars</span>();
510537
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">rev</span> <span class="op">=</span> <span class="ident">String::new</span>();
511538
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">i</span> <span class="op">=</span> <span class="ident">position</span>;
@@ -514,7 +541,14 @@
514541
<span class="ident">i</span> <span class="op">-</span><span class="op">=</span> <span class="number">1</span>;
515542
<span class="kw">match</span> <span class="ident">c</span> {
516543
<span class="string">&#39;9&#39;</span> =&gt; {
517-
<span class="ident">rev</span>.<span class="ident">push</span>(<span class="string">&#39;0&#39;</span>);
544+
<span class="comment">// If we&#39;re before the decimal</span>
545+
<span class="comment">// and on the most significant digit,</span>
546+
<span class="comment">// round 9 to 1, else to 0.</span>
547+
<span class="kw">if</span> <span class="ident">before_dec</span> <span class="op">&amp;&amp;</span> <span class="ident">i</span> <span class="op">==</span> <span class="number">0</span> {
548+
<span class="ident">rev</span>.<span class="ident">push</span>(<span class="string">&#39;1&#39;</span>);
549+
} <span class="kw">else</span> {
550+
<span class="ident">rev</span>.<span class="ident">push</span>(<span class="string">&#39;0&#39;</span>);
551+
}
518552
}
519553
<span class="ident">e</span> =&gt; {
520554
<span class="ident">rev</span>.<span class="ident">push</span>(((<span class="ident">e</span> <span class="kw">as</span> <span class="ident">u8</span>) <span class="op">+</span> <span class="number">1</span>) <span class="kw">as</span> <span class="ident">char</span>);
@@ -534,24 +568,32 @@
534568
<span class="ident">before_dec</span>: <span class="ident">String</span>,
535569
<span class="ident">after_dec</span>: <span class="ident">String</span>,
536570
<span class="ident">position</span>: <span class="ident">usize</span>,
537-
) -&gt; (<span class="ident">String</span>, <span class="ident">String</span>) {
571+
) -&gt; (<span class="ident">String</span>, <span class="ident">String</span>, <span class="ident">bool</span>) {
538572
<span class="kw">if</span> <span class="ident">position</span> <span class="op">&lt;</span> <span class="ident">after_dec</span>.<span class="ident">len</span>() {
539573
<span class="kw">let</span> <span class="ident">digit_at_pos</span>: <span class="ident">char</span>;
540574
{
541575
<span class="ident">digit_at_pos</span> <span class="op">=</span> <span class="ident">after_dec</span>[<span class="ident">position</span>..<span class="op">=</span><span class="ident">position</span>].<span class="ident">chars</span>().<span class="ident">next</span>().<span class="ident">expect</span>(<span class="string">&quot;&quot;</span>);
542576
}
543577
<span class="kw">if</span> <span class="kw">let</span> <span class="string">&#39;5&#39;</span>..<span class="op">=</span><span class="string">&#39;9&#39;</span> <span class="op">=</span> <span class="ident">digit_at_pos</span> {
544-
<span class="kw">let</span> (<span class="ident">new_after_dec</span>, <span class="ident">finished_in_dec</span>) <span class="op">=</span> <span class="ident">_round_str_from</span>(<span class="kw-2">&amp;</span><span class="ident">after_dec</span>, <span class="ident">position</span>);
578+
<span class="kw">let</span> (<span class="ident">new_after_dec</span>, <span class="ident">finished_in_dec</span>) <span class="op">=</span> <span class="ident">_round_str_from</span>(<span class="kw-2">&amp;</span><span class="ident">after_dec</span>, <span class="ident">position</span>, <span class="bool-val">false</span>);
545579
<span class="kw">if</span> <span class="ident">finished_in_dec</span> {
546-
<span class="kw">return</span> (<span class="ident">before_dec</span>, <span class="ident">new_after_dec</span>);
580+
<span class="kw">return</span> (<span class="ident">before_dec</span>, <span class="ident">new_after_dec</span>, <span class="bool-val">false</span>);
547581
} <span class="kw">else</span> {
548-
<span class="kw">let</span> (<span class="ident">new_before_dec</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">_round_str_from</span>(<span class="kw-2">&amp;</span><span class="ident">before_dec</span>, <span class="ident">before_dec</span>.<span class="ident">len</span>());
549-
<span class="kw">return</span> (<span class="ident">new_before_dec</span>, <span class="ident">new_after_dec</span>);
582+
<span class="kw">let</span> (<span class="ident">new_before_dec</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">_round_str_from</span>(<span class="kw-2">&amp;</span><span class="ident">before_dec</span>, <span class="ident">before_dec</span>.<span class="ident">len</span>(), <span class="bool-val">true</span>);
583+
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">dec_place_chg</span> <span class="op">=</span> <span class="bool-val">false</span>;
584+
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">before_dec_chars</span> <span class="op">=</span> <span class="ident">new_before_dec</span>.<span class="ident">chars</span>();
585+
<span class="kw">if</span> <span class="ident">before_dec_chars</span>.<span class="ident">next</span>() <span class="op">==</span> <span class="prelude-val">Some</span>(<span class="string">&#39;1&#39;</span>) <span class="op">&amp;&amp;</span> <span class="ident">before_dec_chars</span>.<span class="ident">all</span>(<span class="op">|</span><span class="ident">c</span><span class="op">|</span> <span class="ident">c</span> <span class="op">==</span> <span class="string">&#39;0&#39;</span>) {
586+
<span class="comment">// If the first digit is a one and remaining are zeros, we have</span>
587+
<span class="comment">// rounded to a new decimal place, so the decimal place must be updated.</span>
588+
<span class="comment">// Only update decimal place if the before decimal != 0</span>
589+
<span class="ident">dec_place_chg</span> <span class="op">=</span> <span class="ident">before_dec</span> <span class="op">!</span><span class="op">=</span> <span class="string">&quot;0&quot;</span>;
590+
}
591+
<span class="kw">return</span> (<span class="ident">new_before_dec</span>, <span class="ident">new_after_dec</span>, <span class="ident">dec_place_chg</span>);
550592
}
551593
<span class="comment">// TODO</span>
552594
}
553595
}
554-
(<span class="ident">before_dec</span>, <span class="ident">after_dec</span>)
596+
(<span class="ident">before_dec</span>, <span class="ident">after_dec</span>, <span class="bool-val">false</span>)
555597
}
556598

557599
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_primitive_dec</span>(
@@ -589,7 +631,7 @@
589631
<span class="ident">String::from</span>(<span class="ident">second_segment_raw</span>),
590632
),
591633
};
592-
<span class="kw">let</span> (<span class="ident">pre_dec_unrounded</span>, <span class="ident">post_dec_unrounded</span>, <span class="ident">mantissa</span>) <span class="op">=</span> <span class="kw">if</span> <span class="ident">sci_mode</span>.<span class="ident">is_some</span>() {
634+
<span class="kw">let</span> (<span class="ident">pre_dec_unrounded</span>, <span class="ident">post_dec_unrounded</span>, <span class="kw-2">mut</span> <span class="ident">mantissa</span>) <span class="op">=</span> <span class="kw">if</span> <span class="ident">sci_mode</span>.<span class="ident">is_some</span>() {
593635
<span class="kw">if</span> <span class="ident">first_segment</span>.<span class="ident">len</span>() <span class="op">&gt;</span> <span class="number">1</span> {
594636
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">post_dec</span> <span class="op">=</span> <span class="ident">String::from</span>(<span class="kw-2">&amp;</span><span class="ident">first_segment</span>[<span class="number">1</span>..]);
595637
<span class="ident">post_dec</span>.<span class="ident">push_str</span>(<span class="kw-2">&amp;</span><span class="ident">second_segment</span>);
@@ -629,20 +671,28 @@
629671
(<span class="ident">first_segment</span>, <span class="ident">second_segment</span>, <span class="number">0</span>)
630672
};
631673

632-
<span class="kw">let</span> (<span class="ident">pre_dec_draft</span>, <span class="ident">post_dec_draft</span>) <span class="op">=</span>
674+
<span class="kw">let</span> (<span class="ident">pre_dec_draft</span>, <span class="ident">post_dec_draft</span>, <span class="ident">dec_place_chg</span>) <span class="op">=</span>
633675
<span class="ident">round_terminal_digit</span>(<span class="ident">pre_dec_unrounded</span>, <span class="ident">post_dec_unrounded</span>, <span class="ident">last_dec_place</span> <span class="op">-</span> <span class="number">1</span>);
634-
635-
<span class="ident">f</span>.<span class="ident">pre_decimal</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">pre_dec_draft</span>);
636676
<span class="ident">f</span>.<span class="ident">post_decimal</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">post_dec_draft</span>);
637677
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">capitalized</span>) <span class="op">=</span> <span class="ident">sci_mode</span> {
638678
<span class="kw">let</span> <span class="ident">si_ind</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">capitalized</span> { <span class="string">&#39;E&#39;</span> } <span class="kw">else</span> { <span class="string">&#39;e&#39;</span> };
679+
<span class="comment">// Increase the mantissa if we&#39;re adding a decimal place</span>
680+
<span class="kw">if</span> <span class="ident">dec_place_chg</span> {
681+
<span class="ident">mantissa</span> <span class="op">+</span><span class="op">=</span> <span class="number">1</span>;
682+
}
639683
<span class="ident">f</span>.<span class="ident">suffix</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="kw">if</span> <span class="ident">mantissa</span> <span class="op">&gt;</span><span class="op">=</span> <span class="number">0</span> {
640684
<span class="macro">format!</span>(<span class="string">&quot;{}+{:02}&quot;</span>, <span class="ident">si_ind</span>, <span class="ident">mantissa</span>)
641685
} <span class="kw">else</span> {
642686
<span class="comment">// negative sign is considered in format!s</span>
643687
<span class="comment">// leading zeroes</span>
644688
<span class="macro">format!</span>(<span class="string">&quot;{}{:03}&quot;</span>, <span class="ident">si_ind</span>, <span class="ident">mantissa</span>)
645689
});
690+
<span class="ident">f</span>.<span class="ident">pre_decimal</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">pre_dec_draft</span>);
691+
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">dec_place_chg</span> {
692+
<span class="comment">// We&#39;ve rounded up to a new decimal place so append 0</span>
693+
<span class="ident">f</span>.<span class="ident">pre_decimal</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">pre_dec_draft</span> <span class="op">+</span> <span class="string">&quot;0&quot;</span>);
694+
} <span class="kw">else</span> {
695+
<span class="ident">f</span>.<span class="ident">pre_decimal</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">pre_dec_draft</span>);
646696
}
647697

648698
<span class="ident">f</span>

0 commit comments

Comments
 (0)