This commit is contained in:
sylvestre
2021-08-30 02:25:46 +00:00
parent 0bb8285776
commit 562f6ca531
4 changed files with 117 additions and 9 deletions
+114 -6
View File
@@ -316,6 +316,60 @@
<span id="314">314</span>
<span id="315">315</span>
<span id="316">316</span>
<span id="317">317</span>
<span id="318">318</span>
<span id="319">319</span>
<span id="320">320</span>
<span id="321">321</span>
<span id="322">322</span>
<span id="323">323</span>
<span id="324">324</span>
<span id="325">325</span>
<span id="326">326</span>
<span id="327">327</span>
<span id="328">328</span>
<span id="329">329</span>
<span id="330">330</span>
<span id="331">331</span>
<span id="332">332</span>
<span id="333">333</span>
<span id="334">334</span>
<span id="335">335</span>
<span id="336">336</span>
<span id="337">337</span>
<span id="338">338</span>
<span id="339">339</span>
<span id="340">340</span>
<span id="341">341</span>
<span id="342">342</span>
<span id="343">343</span>
<span id="344">344</span>
<span id="345">345</span>
<span id="346">346</span>
<span id="347">347</span>
<span id="348">348</span>
<span id="349">349</span>
<span id="350">350</span>
<span id="351">351</span>
<span id="352">352</span>
<span id="353">353</span>
<span id="354">354</span>
<span id="355">355</span>
<span id="356">356</span>
<span id="357">357</span>
<span id="358">358</span>
<span id="359">359</span>
<span id="360">360</span>
<span id="361">361</span>
<span id="362">362</span>
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
<span id="368">368</span>
<span id="369">369</span>
<span id="370">370</span>
</pre><pre class="rust">
<span class="comment">// TODO: Make -w flag work with decimals</span>
<span class="comment">// TODO: Support -f flag</span>
@@ -380,6 +434,38 @@
<span class="ident">Number::F64</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>,
}
}
<span class="doccomment">/// Number of characters needed to print the integral part of the number.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The number of characters includes one character to represent the</span>
<span class="doccomment">/// minus sign (&quot;-&quot;) if this number is negative.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// # Examples</span>
<span class="doccomment">///</span>
<span class="doccomment">/// ```rust,ignore</span>
<span class="doccomment">/// use num_bigint::{BigInt, Sign};</span>
<span class="doccomment">///</span>
<span class="doccomment">/// assert_eq!(</span>
<span class="doccomment">/// Number::BigInt(BigInt::new(Sign::Plus, vec![123])).num_digits(),</span>
<span class="doccomment">/// 3</span>
<span class="doccomment">/// );</span>
<span class="doccomment">/// assert_eq!(</span>
<span class="doccomment">/// Number::BigInt(BigInt::new(Sign::Minus, vec![123])).num_digits(),</span>
<span class="doccomment">/// 4</span>
<span class="doccomment">/// );</span>
<span class="doccomment">/// assert_eq!(Number::F64(123.45).num_digits(), 3);</span>
<span class="doccomment">/// assert_eq!(Number::MinusZero.num_digits(), 2);</span>
<span class="doccomment">/// ```</span>
<span class="kw">fn</span> <span class="ident">num_digits</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">usize</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident">Number::MinusZero</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">2</span>,
<span class="ident">Number::BigInt</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">to_string</span>().<span class="ident">len</span>(),
<span class="ident">Number::F64</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">n</span>.<span class="ident">to_string</span>();
<span class="ident">s</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">len</span>())
}
}
}
}
<span class="kw">impl</span> <span class="ident">FromStr</span> <span class="kw">for</span> <span class="ident">Number</span> {
@@ -440,13 +526,11 @@
};
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">largest_dec</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">padding</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="ident">first</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">numbers</span>.<span class="ident">len</span>() <span class="op">&gt;</span> <span class="number">1</span> {
<span class="kw">let</span> <span class="ident">slice</span> <span class="op">=</span> <span class="ident">numbers</span>[<span class="number">0</span>];
<span class="kw">let</span> <span class="ident">len</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">len</span>();
<span class="kw">let</span> <span class="ident">dec</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or</span>(<span class="ident">len</span>);
<span class="ident">largest_dec</span> <span class="op">=</span> <span class="ident">len</span> <span class="op">-</span> <span class="ident">dec</span>;
<span class="ident">padding</span> <span class="op">=</span> <span class="ident">dec</span>;
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">slice</span>.<span class="ident">parse</span>())
} <span class="kw">else</span> {
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::one</span>())
@@ -456,7 +540,6 @@
<span class="kw">let</span> <span class="ident">len</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">len</span>();
<span class="kw">let</span> <span class="ident">dec</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or</span>(<span class="ident">len</span>);
<span class="ident">largest_dec</span> <span class="op">=</span> <span class="ident">cmp::max</span>(<span class="ident">largest_dec</span>, <span class="ident">len</span> <span class="op">-</span> <span class="ident">dec</span>);
<span class="ident">padding</span> <span class="op">=</span> <span class="ident">cmp::max</span>(<span class="ident">padding</span>, <span class="ident">dec</span>);
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">slice</span>.<span class="ident">parse</span>())
} <span class="kw">else</span> {
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::one</span>())
@@ -469,15 +552,18 @@
);
<span class="kw">return</span> <span class="number">1</span>;
}
<span class="kw">let</span> <span class="ident">last</span> <span class="op">=</span> {
<span class="kw">let</span> <span class="ident">last</span>: <span class="ident">Number</span> <span class="op">=</span> {
<span class="kw">let</span> <span class="ident">slice</span> <span class="op">=</span> <span class="ident">numbers</span>[<span class="ident">numbers</span>.<span class="ident">len</span>() <span class="op">-</span> <span class="number">1</span>];
<span class="ident">padding</span> <span class="op">=</span> <span class="ident">cmp::max</span>(<span class="ident">padding</span>, <span class="ident">slice</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">slice</span>.<span class="ident">len</span>()));
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">slice</span>.<span class="ident">parse</span>())
};
<span class="kw">if</span> <span class="ident">largest_dec</span> <span class="op">&gt;</span> <span class="number">0</span> {
<span class="ident">largest_dec</span> <span class="op">-</span><span class="op">=</span> <span class="number">1</span>;
}
<span class="kw">let</span> <span class="ident">padding</span> <span class="op">=</span> <span class="ident">first</span>
.<span class="ident">num_digits</span>()
.<span class="ident">max</span>(<span class="ident">increment</span>.<span class="ident">num_digits</span>())
.<span class="ident">max</span>(<span class="ident">last</span>.<span class="ident">num_digits</span>());
<span class="kw">match</span> (<span class="ident">first</span>, <span class="ident">last</span>, <span class="ident">increment</span>) {
(<span class="ident">Number::MinusZero</span>, <span class="ident">Number::BigInt</span>(<span class="ident">last</span>), <span class="ident">Number::BigInt</span>(<span class="ident">increment</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">print_seq_integers</span>(
(<span class="ident">BigInt::zero</span>(), <span class="ident">increment</span>, <span class="ident">last</span>),
@@ -617,12 +703,14 @@
<span class="kw">if</span> <span class="op">!</span><span class="ident">is_first_iteration</span> {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">separator</span>);
}
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">width</span> <span class="op">=</span> <span class="ident">padding</span>;
<span class="kw">if</span> <span class="ident">is_first_iteration</span> <span class="op">&amp;&amp;</span> <span class="ident">is_first_minus_zero</span> {
<span class="macro">print!</span>(<span class="string">&quot;-&quot;</span>);
<span class="ident">width</span> <span class="op">-</span><span class="op">=</span> <span class="number">1</span>;
}
<span class="ident">is_first_iteration</span> <span class="op">=</span> <span class="bool-val">false</span>;
<span class="kw">if</span> <span class="ident">pad</span> {
<span class="macro">print!</span>(<span class="string">&quot;{number:&gt;0width$}&quot;</span>, <span class="ident">number</span> <span class="op">=</span> <span class="ident">value</span>, <span class="ident">width</span> <span class="op">=</span> <span class="ident">padding</span>);
<span class="macro">print!</span>(<span class="string">&quot;{number:&gt;0width$}&quot;</span>, <span class="ident">number</span> <span class="op">=</span> <span class="ident">value</span>, <span class="ident">width</span> <span class="op">=</span> <span class="ident">width</span>);
} <span class="kw">else</span> {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">value</span>);
}
@@ -633,5 +721,25 @@
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">terminator</span>);
}
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="kw">mod</span> <span class="ident">tests</span> {
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::Number</span>;
<span class="kw">use</span> <span class="ident">num_bigint</span>::{<span class="ident">BigInt</span>, <span class="ident">Sign</span>};
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_number_num_digits</span>() {
<span class="macro">assert_eq!</span>(
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::new</span>(<span class="ident">Sign::Plus</span>, <span class="macro">vec!</span>[<span class="number">123</span>])).<span class="ident">num_digits</span>(),
<span class="number">3</span>
);
<span class="macro">assert_eq!</span>(
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::new</span>(<span class="ident">Sign::Minus</span>, <span class="macro">vec!</span>[<span class="number">123</span>])).<span class="ident">num_digits</span>(),
<span class="number">4</span>
);
<span class="macro">assert_eq!</span>(<span class="ident">Number::F64</span>(<span class="number">123.45</span>).<span class="ident">num_digits</span>(), <span class="number">3</span>);
<span class="macro">assert_eq!</span>(<span class="ident">Number::MinusZero</span>.<span class="ident">num_digits</span>(), <span class="number">2</span>);
}
}
</pre></div>
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_seq" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script></body></html>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long