poniedziałek, 16 kwietnia 2012

Prosty walidator PESEL - C#

Nazwa PESEL pochodzi od "Powszechny elektroniczny system ewidencji ludności". Numer składa się zawsze z 11 cyfr, z których:
1. Pierwsze 6 cyfr stanowi datę urodzenia (ddmmyy)*
     * dla numerów PESEL z lat 2000 - 2099 do liczby miesięcy dodajemy 20! (np 103010 stanowi 10.10.2010)
2. cyfry od 7 do 10 to numer serii wraz z kodem płci (płeć to cyfra dziesiąta. Parzyste to żeńska, nieparzyste - męska)
3. cyfra 11 stanowi cyfrę kontrolną

Cyfrę kontrolną obliczamy mnożąć kolejne cyfry (od 1 do 10) przez następujące wagi (kolejno):
{1, 3, 7, 9, 1, 3, 7, 9, 1, 3}
iloczyny sumujemy. Następnie otrzymaną sumę dzielimy przez 10.
a. jeśli w wyniku otrzymamy 0 i jedenasta cyfra numeru PESEL to 0 - numer jest poprawny
b. jeśli uzyskaliśmy wynik inny niż 0, odejmujemy ją od 10. Jeśli wynik odejmowania jest równy jedenastej cyfrze numeru PESEL - numer jest poprawny. Jeśli nie - jest błędny.

Poniżej opisany algorytm w implementacji C#:

/*
 * Created by SharpDevelop.
 * User: PJ
 * Date: 2012-04-10
 * Time: 21:35
 * 
 */
using System;

namespace Validators
{
    /// <summary>
    /// Klasa statyczna PeselValidator.
    /// </summary>
    public static class PeselValidator
    {
        /// <summary>
        /// Mnozniki dla PESEL
        /// </summary>
        private static readonly int[] mnozniki = {1, 3, 7, 9, 1, 3, 7, 9, 1, 3};
        
        /// <summary>
        /// Sprawdza PESEL pod kątem poprawności
        /// </summary>
        /// <param name="pesel">PESEL string</param>
        /// <returns>true = OK; false = NOK</returns>
        public static bool ValidatePesel(string pesel)
        {
            bool toRet = false;
            try
            {
                if(pesel.Length == 11)
                {
                    toRet = CountSum(pesel).Equals(pesel[10].ToString());
                }
                }
                catch(Exception)
                {
                    toRet = false;
            }
            return toRet;
        }
        
        /// <summary>
        /// Liczy sumę cyfr znaczących PESEL
        /// </summary>
        /// <param name="pesel">PESEL string</param>
        /// <returns>SUMA string</returns>
        private static string CountSum(string pesel)
        {
            int sum = 0;            
            for(int i = 0; i < mnozniki.Length; i++)
            {
                sum+=mnozniki[i]*int.Parse(pesel[i].ToString());
            }
            
            int reszta = sum%10;
            return reszta == 0 ? reszta.ToString() : (10-reszta).ToString();
        }
    }
}

niedziela, 15 kwietnia 2012

ZedGraph - dodanie własnych etykiet wartości

Zastanawialiście się jak wyświetlić własne etykiety wartości na wykresach ZedGraph*?
Otóż - najprostszym przykładem niech będzie dodanie eventu do OnLoad formatki.
Uprzednio musimy jednak w OnLoad formatki wymusić pokazywanie "PointValues".
Za powyższe odpowiada property "IsShowPointValues", która w przypadku wartości true pobiera dane do PointValue z Labeli osi wykresu.

I tak - kod OnLoad'a:
private void Wykresy_Load(object sender, EventArgs e)

        {

            CreateGraph(zedGraphControl1);

            SetSize();

            //Wymuszamy PointValues

            zedGraphControl1.IsShowPointValues = true;

            //dopinamy nasz Event

            this.zedGraphControl1.PointValueEvent += this.zedGraphControl1_PointValueEvent;

        }

i kod samego Eventu:
private string zedGraphControl1_PointValueEvent(ZedGraphControl sender, 

                                                               GraphPane pane, CurveItem curve, int iPt)

        {

            //Wolna droga - ustawmy co nam sie podoba ;)

            return curve.Label.Text + " - " + curve.Points[iPt].Y;

        }


Efekt finalny:

Screen 1: własny label na wykresie ZedGraph

* przykład sprawdzony z ZedGraph w wersji 5.1.5.28844

Xml Writer - prosta instrukcja użycia

Zastanawiasz się jak w prosty sposób zapisać XML na podstawie listy danych, którą dostałeś z innej metody?
Znów - z pomocą przychodzi XmlWriter z Foreachem (Używaj list typizowanych! Unikniesz problemów!)

            XmlWriter writer = XmlWriter.Create(@"C:\pliki.xml", null);
            writer.WriteStartDocument();
            writer.WriteStartElement("Files");

            if (files.Count != 0)
                foreach (string s in files)
                {
                    writer.WriteStartElement("File");
                    writer.WriteString(s);
                    writer.WriteEndElement();
                }
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Flush();
            writer.Close();

Formatowanie XML w C#

Po co używać StringBuildera, skoro możemy prosto uzyskać pięknie sformatowany XML przy użyciu XmlWritera?

A oto jak:
 //Ustawienia XML Writera
  
 XmlWriterSettings set = new XmlWriterSettings();
  
 //"Ładne" formatowanie - true
  
 set.Indent = true;
  
 //i Nowy piękny XmlWriter - voila ;)
  
 XmlWriter writer = XmlWriter.Create(@"here should be a path to our pretty xml", set);