Update 2.0

Changes to formatting system

Create a formatting struct and then pass it to the
to_text macro or the
to_text_fmt function to format the strings accordingly
Updated docs for the new version
This commit is contained in:
Uttarayan Mondal
2021-03-08 23:40:19 +05:30
parent 89e4ee1442
commit cc82c47628
34 changed files with 932 additions and 392 deletions
+21 -91
View File
@@ -40,114 +40,44 @@
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="doccomment">//!```rust</span>
<span class="doccomment">//!extern crate ntext;</span>
<span class="doccomment">//!use ntext::digit_to_text;</span>
<span class="doccomment">//!fn main() {</span>
<span class="doccomment">//! println!(&quot;{}&quot;,digit_to_text(1).unwrap());</span>
<span class="doccomment">//! assert_eq!(&quot;two&quot;,digit_to_text(2).unwrap());</span>
<span class="doccomment">//! assert_ne!(&quot;five&quot;,digit_to_text(8).unwrap());</span>
<span class="doccomment">//!}</span>
<span class="doccomment">//!```</span>
<span class="doccomment">//! However giving the program a zero will return an empty string.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! Example program with default formatting</span>
<span class="doccomment">//!```rust</span>
<span class="doccomment">//!extern crate ntext;</span>
<span class="doccomment">//!use ntext::to_text;</span>
<span class="doccomment">//!fn main() {</span>
<span class="doccomment">//! println!(&quot;{}&quot;,to_text!(1312));</span>
<span class="doccomment">//! assert_eq!(to_text!(1312),&quot;onethousandthreehundredtwelve&quot;);</span>
<span class="doccomment">//! println!(&quot;{}&quot;,to_text!(7123));</span>
<span class="doccomment">//! assert_eq!(to_text!(7123,&quot; &quot;),&quot;seven thousand one hundred twenty three&quot;);</span>
<span class="doccomment">//! assert_eq!(to_text!(7123),&quot;Seven Thousand,One Hundred,Twenty-Three&quot;);</span>
<span class="doccomment">//! assert_eq!(to_text!(1000),&quot;One Thousand&quot;);</span>
<span class="doccomment">//!}</span>
<span class="doccomment">//!```</span>
<span class="doccomment">//! Example program with custom formatting</span>
<span class="doccomment">//!</span>
<span class="doccomment">//!```rust</span>
<span class="doccomment">//!extern crate ntext;</span>
<span class="doccomment">//!use ntext::{Formatting,to_text};</span>
<span class="doccomment">//!fn main() {</span>
<span class="doccomment">//! assert_eq!(to_text!(1000, &amp;Formatting::none().capitalize()),&quot;OneThousand&quot;);</span>
<span class="doccomment">//! assert_eq!(to_text!(34123, &amp;Formatting::with_seperator(&quot;#&quot;).capitalize()),&quot;Thirty#Four#Thousand#One#Hundred#Twenty#Three&quot;);</span>
<span class="doccomment">//!}</span>
<span class="doccomment">//!```</span>
<span class="doccomment">//! This macro will also return an empty string on input zero</span>
<span class="doccomment">//! You can also create the Formatting struct manually</span>
<span class="kw">mod</span> <span class="ident">no_seperator</span>;
<span class="kw">mod</span> <span class="ident">seperator</span>;
<span class="kw">mod</span> <span class="ident">formatting</span>;
<span class="kw">mod</span> <span class="ident">numtext</span>;
<span class="kw">mod</span> <span class="ident">test</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">no_seperator</span>::<span class="ident">to_text_no_seperator</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">seperator</span>::<span class="ident">to_text_with_seperator</span>;
<span class="doccomment">/// Convert digit to words in a string.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">digit_to_text</span>(<span class="ident">digit</span>: <span class="ident">u8</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">match</span> <span class="ident">digit</span> {
<span class="number">0</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">1</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;one&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">2</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;two&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">3</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;three&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">4</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;four&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">5</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;five&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">6</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;six&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">7</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;seven&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">8</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;eight&quot;</span>.<span class="ident">to_string</span>()),
<span class="number">9</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="string">&quot;nine&quot;</span>.<span class="ident">to_string</span>()),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">None</span>,
}
}
<span class="kw">fn</span> <span class="ident">place_value</span>(<span class="ident">number</span>: <span class="ident">u8</span>, <span class="ident">place</span>: <span class="ident">u8</span>, <span class="ident">seperator</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">str</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buffer</span> <span class="op">=</span> <span class="ident">digit_to_text</span>(<span class="ident">number</span>).<span class="ident">unwrap</span>();
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">sep</span>) <span class="op">=</span> <span class="ident">seperator</span> {
<span class="kw">if</span> <span class="ident">number</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> {
<span class="ident">buffer</span>.<span class="ident">push_str</span>(<span class="ident">sep</span>)
}
}
<span class="kw">match</span> <span class="ident">place</span> {
<span class="number">1</span> <span class="op">=</span><span class="op">&gt;</span> (),
<span class="number">2</span> <span class="op">=</span><span class="op">&gt;</span> (), <span class="comment">//This should never happen as 2 is included in the tens_place_holders</span>
<span class="number">3</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">buffer</span>.<span class="ident">push_str</span>(<span class="string">&quot;hundred&quot;</span>),
<span class="number">4</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">buffer</span>.<span class="ident">push_str</span>(<span class="string">&quot;thousand&quot;</span>),
<span class="number">5</span> <span class="op">=</span><span class="op">&gt;</span> (), <span class="comment">// Souldn&#39;t happen</span>
<span class="number">6</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">buffer</span>.<span class="ident">push_str</span>(<span class="string">&quot;million&quot;</span>),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> (),
};
<span class="prelude-val">Some</span>(<span class="ident">buffer</span>)
}
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">formatting</span>::<span class="ident">Formatting</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">numtext</span>::{<span class="ident">digit_to_text</span>, <span class="ident">to_text_fmt</span>};
<span class="doccomment">/// Macro which supports both seperator and without it</span>
<span class="attribute">#[<span class="ident">macro_export</span>]</span>
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">to_text</span> {
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">number</span>:<span class="ident">expr</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">ntext</span>::<span class="ident">to_text_no_seperator</span>(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">number</span>);
<span class="ident">ntext</span>::<span class="ident">to_text_fmt</span>(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">number</span>, <span class="kw-2">&amp;</span><span class="ident">ntext</span>::<span class="ident">Formatting</span>::<span class="ident">default</span>());
};
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">number</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">seperator</span>:<span class="ident">expr</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">ntext</span>::<span class="ident">to_text_with_seperator</span>(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">number</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">seperator</span>);
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">number</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">formatting</span>:<span class="ident">expr</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">ntext</span>::<span class="ident">to_text_fmt</span>(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">number</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">formatting</span>);
};
}
</pre></div>