|
350 | 350 | <span id="348">348</span>
|
351 | 351 | <span id="349">349</span>
|
352 | 352 | <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> |
353 | 378 | </pre><pre class="rust"><code><span class="comment">// spell-checker:ignore (vars) charf decf floatf intf scif strf Cninety</span>
|
354 | 379 | <span class="comment">// spell-checker:ignore (ToDO) arrnum</span>
|
355 | 380 |
|
|
505 | 530 | <span class="comment">// bumps the last digit up one,</span>
|
506 | 531 | <span class="comment">// and if the digit was nine</span>
|
507 | 532 | <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">&</span><span class="ident">str</span>, <span class="ident">position</span>: <span class="ident">usize</span>) -> (<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">&</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>) -> (<span class="ident">String</span>, <span class="ident">bool</span>) { |
509 | 536 | <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>();
|
510 | 537 | <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>();
|
511 | 538 | <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 | 541 | <span class="ident">i</span> <span class="op">-</span><span class="op">=</span> <span class="number">1</span>;
|
515 | 542 | <span class="kw">match</span> <span class="ident">c</span> {
|
516 | 543 | <span class="string">'9'</span> => {
|
517 |
| - <span class="ident">rev</span>.<span class="ident">push</span>(<span class="string">'0'</span>); |
| 544 | + <span class="comment">// If we'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">&&</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">'1'</span>); |
| 549 | + } <span class="kw">else</span> { |
| 550 | + <span class="ident">rev</span>.<span class="ident">push</span>(<span class="string">'0'</span>); |
| 551 | + } |
518 | 552 | }
|
519 | 553 | <span class="ident">e</span> => {
|
520 | 554 | <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 | 568 | <span class="ident">before_dec</span>: <span class="ident">String</span>,
|
535 | 569 | <span class="ident">after_dec</span>: <span class="ident">String</span>,
|
536 | 570 | <span class="ident">position</span>: <span class="ident">usize</span>,
|
537 |
| -) -> (<span class="ident">String</span>, <span class="ident">String</span>) { |
| 571 | +) -> (<span class="ident">String</span>, <span class="ident">String</span>, <span class="ident">bool</span>) { |
538 | 572 | <span class="kw">if</span> <span class="ident">position</span> <span class="op"><</span> <span class="ident">after_dec</span>.<span class="ident">len</span>() {
|
539 | 573 | <span class="kw">let</span> <span class="ident">digit_at_pos</span>: <span class="ident">char</span>;
|
540 | 574 | {
|
541 | 575 | <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">""</span>);
|
542 | 576 | }
|
543 | 577 | <span class="kw">if</span> <span class="kw">let</span> <span class="string">'5'</span>..<span class="op">=</span><span class="string">'9'</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">&</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">&</span><span class="ident">after_dec</span>, <span class="ident">position</span>, <span class="bool-val">false</span>); |
545 | 579 | <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>); |
547 | 581 | } <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">&</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">&</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">'1'</span>) <span class="op">&&</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">'0'</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">"0"</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>); |
550 | 592 | }
|
551 | 593 | <span class="comment">// TODO</span>
|
552 | 594 | }
|
553 | 595 | }
|
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>) |
555 | 597 | }
|
556 | 598 |
|
557 | 599 | <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_primitive_dec</span>(
|
|
589 | 631 | <span class="ident">String::from</span>(<span class="ident">second_segment_raw</span>),
|
590 | 632 | ),
|
591 | 633 | };
|
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>() { |
593 | 635 | <span class="kw">if</span> <span class="ident">first_segment</span>.<span class="ident">len</span>() <span class="op">></span> <span class="number">1</span> {
|
594 | 636 | <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">&</span><span class="ident">first_segment</span>[<span class="number">1</span>..]);
|
595 | 637 | <span class="ident">post_dec</span>.<span class="ident">push_str</span>(<span class="kw-2">&</span><span class="ident">second_segment</span>);
|
|
629 | 671 | (<span class="ident">first_segment</span>, <span class="ident">second_segment</span>, <span class="number">0</span>)
|
630 | 672 | };
|
631 | 673 |
|
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> |
633 | 675 | <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>); |
636 | 676 | <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>);
|
637 | 677 | <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> {
|
638 | 678 | <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">'E'</span> } <span class="kw">else</span> { <span class="string">'e'</span> };
|
| 679 | + <span class="comment">// Increase the mantissa if we'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 | + } |
639 | 683 | <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">></span><span class="op">=</span> <span class="number">0</span> {
|
640 | 684 | <span class="macro">format!</span>(<span class="string">"{}+{:02}"</span>, <span class="ident">si_ind</span>, <span class="ident">mantissa</span>)
|
641 | 685 | } <span class="kw">else</span> {
|
642 | 686 | <span class="comment">// negative sign is considered in format!s</span>
|
643 | 687 | <span class="comment">// leading zeroes</span>
|
644 | 688 | <span class="macro">format!</span>(<span class="string">"{}{:03}"</span>, <span class="ident">si_ind</span>, <span class="ident">mantissa</span>)
|
645 | 689 | });
|
| 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'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">"0"</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>); |
646 | 696 | }
|
647 | 697 |
|
648 | 698 | <span class="ident">f</span>
|
|
0 commit comments