<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dejan on Technology &#187; Source Code</title>
	<atom:link href="http://www.vesic.org/english/blog/category/source-code/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vesic.org/english/blog</link>
	<description>dotNet, ASP.Net, Programming, Software ...</description>
	<lastBuildDate>Mon, 01 Mar 2010 09:07:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Verifying Chilean RUT code (tax number) in C#</title>
		<link>http://www.vesic.org/english/blog/c-sharp/verifying-chilean-rut-code-tax-number/</link>
		<comments>http://www.vesic.org/english/blog/c-sharp/verifying-chilean-rut-code-tax-number/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 22:08:29 +0000</pubDate>
		<dc:creator>Dejan Vesić</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Source Code]]></category>

		<guid isPermaLink="false">http://www.vesic.org/english/blog/?p=110</guid>
		<description><![CDATA[In one of the projects at my work, I got task to verify some data (in migration process from old system to new one); one of the fields was Chilean RUT (Rol Único Tributario) or Tax Identification Number. The RUT has 8 digits plus a validation number or letter (xx.xxx.xxx-z) and algorithm for verification (as [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/blog/upload/chile-rut.jpg" height="119" width="137" alt="" class="imageRight" />In one of the projects at my work, I got task to verify some data (in migration process from old system to new one); one of the fields was Chilean <a href="http://en.wikipedia.org/wiki/Rol_%C3%9Anico_Tributario#Chile">RUT</a> (Rol Único Tributario) or Tax Identification Number.</p>
<p>The RUT has 8 digits plus a validation number or letter (xx.xxx.xxx-z) and algorithm for verification (as per my knowledge) is as follows:<br />
<br clear="all" /></p>
<ol>
<li>Remove all characters except digits and last char which can be digit or letter &#8220;K&#8221;</li>
<li>Pad with zeros (&#8220;0&#8243;) string until it is exactly 9 symbols long</li>
<li>Multiply, from left to right, first 8 digits with following factors: 3, 2, 7, 6, 5, 4, 3, 2 and sum those results (let&#8217;s call it <strong>total</strong>)</li>
<li>Find difference: 11 &#8211; (<strong>total</strong> % 11) (let&#8217;s call it <strong>rest</strong>)</li>
<li>Determine control char by:
<ol>
5.1 If <strong>rest = 11</strong>, than control char &#8220;<strong>0</strong>&#8221; (zero)<br />
5.2 If <strong>rest = 10</strong>, than control char <strong>&#8220;K&#8221;</strong><br />
5.3 Otherwise, <strong>rest is control char</strong>
</ol>
</li>
<li>If the original control char (9<sup>th</sup> char) is equal to calculated control char, RUT is valid.</li>
</ol>
<p>C# code for this could be like this:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<pre class="csharpcode">
<span class="rem">/// &lt;summary&gt;</span>
<span class="rem">/// Routine for checking of RUT correctness</span>
<span class="rem">/// &lt;/summary&gt;</span>
<span class="rem">/// &lt;param name="rut"&gt;RUT to check&lt;/param&gt;</span>
<span class="rem">/// &lt;returns&gt;true if RUT is valid&lt;/returns&gt;</span>
<span class="rem">/// &lt;remarks&gt;Only numbers and optional "K" at the end of string are expected</span>
<span class="rem">/// &lt;/remarks&gt;</span>
<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">bool</span> IsRutOk(<span class="kwrd">string</span> rut)
{
    <span class="kwrd">const</span> <span class="kwrd">string</span> RutRegex = <span class="str">"[0-9]+K?"</span>;
    Regex RegExRut = <span class="kwrd">new</span> Regex(RutRegex, RegexOptions.Compiled |
    RegexOptions.IgnoreCase);
    <span class="kwrd">int</span>[] coefs = {3, 2, 7, 6, 5, 4, 3, 2};

    <span class="rem">// In case that rut is padded with spaces</span>
    rut = rut.Trim().ToUpperInvariant();

    <span class="kwrd">if</span> (!RegExRut.IsMatch(rut)) { <span class="kwrd">return</span> <span class="kwrd">false</span>; }

    <span class="kwrd">if</span> (rut.Length &gt; 9) { <span class="kwrd">return</span> <span class="kwrd">false</span>; }

    <span class="rem">// If shorter than 9 characters (8 + control char) ...</span>
    <span class="kwrd">while</span> (rut.Length &lt; 9) { rut = <span class="str">"0"</span> + rut; }

    <span class="kwrd">int</span> total = 0;

    <span class="kwrd">for</span> (<span class="kwrd">int</span> index = 0; index &lt; rut.Length - 1; index++)
    {
         <span class="kwrd">char</span> curr = rut.Substring(index, 1).ToCharArray()[0];
         total += coefs[index]*(curr - <span class="str">'0'</span>);
    }

    <span class="kwrd">int</span> rest = 11 - (total%11);

    <span class="kwrd">if</span> (rest == 11) rest = 0;

    <span class="kwrd">if</span> ((rest == 10) &amp;&amp; rut.EndsWith(<span class="str">"K"</span>)) { <span class="kwrd">return</span> <span class="kwrd">true</span>; }

    <span class="kwrd">if</span> (rut.Substring(rut.Length - 1, 1).ToCharArray()[0] == (<span class="str">'0'</span> + rest))
    {
        <span class="kwrd">return</span> <span class="kwrd">true</span>;
    }

    <span class="kwrd">return</span> <span class="kwrd">false</span>;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.vesic.org/english/blog/c-sharp/verifying-chilean-rut-code-tax-number/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

