Saturday, March 12, 2016

C# windows formada sodda Drag & Drop. 3- versiya

Windows Formada dizaynda ishlash murakkab. Drag&Drop  - dasturga o`zgacha ko`rinish beradi va bu ajoyib imkoniyat ham. Uning tayyor kodini olib ishlatish esa undanda ko`proq zavq-shavq beradi :-) 

Oldingi versiyada aytilganidek biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolinadi va unga Action bajartiriladi. DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ldi.
Shuningdek har bir panel tepasiga sarlavha ko`rinishida soha nomini yozib qo`yish mumkin, hamda sohalarga border rangini ham tanlash mumkin bo`ldi.






using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;

namespace Library.Controls
{
    public class DragDropContainer : Control
    {
        private readonly Panel _content = new Panel
        {
            Dock = DockStyle.Fill,
            Padding = new Padding(0)
        };

        private readonly Panel _header = new Panel
        {
            Padding = new Padding(0),
            Height = 20,
            Dock = DockStyle.Top
        };

        private Action _action;
        private bool _mouseDown;
        private string _oldPosition;
        private Point _point = new Point(0, 0);

        public DragDropContainer()
        {
            Controls.Add(_header);
            Controls.Add(_content);
            _content.BringToFront();
        }

        public int ColumnCount { get; set; }
        public Color BorderColor { get; set; } = Color.FromArgb(202, 210, 214);
        public IEnumerable> Child => _content.Controls.OfType().Select(x => x.Child);
        public IEnumerable
        public IEnumerable Panels => _content.Controls.OfType();

        protected override void InitLayout()
        {
            base.InitLayout();

            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width/ColumnCount,
                    Dock = DockStyle.Right,
                    Padding = new Padding(5)
                };
                var label = new Label
                {
                    AutoSize = false,
                    Width = panel.Width,
                    Padding = new Padding(0),
                    Dock = DockStyle.Right,
                    Name = "" + i,
                    TextAlign = ContentAlignment.MiddleCenter
                };
                _content.Controls.Add(panel);
                _header.Controls.Add(label);

                PaintEventHandler paintAction =
                    (sender, args) => ControlPaint.DrawBorder(args.Graphics, (sender as Control).ClientRectangle,
                        BorderColor, ButtonBorderStyle.Solid);
                label.Paint += paintAction;
                panel.Paint += paintAction;
            }
            SizeChanged +=
                (o, args) =>
                {
                    _content.Controls.OfType().ToList().ForEach(x => { x.Width = Width/ColumnCount; });
                    _header.Controls.OfType
                };
        }

        public void Add(Control control, int? position = null)
        {
            var panels = _content.Controls.OfType().ToArray();
            if (panels.Length < 1)
            {
                InitLayout();
                panels = _content.Controls.OfType().ToArray();
            }
            var dragDropPanel = position.HasValue
                ? panels[position.Value]
                : panels.FirstOrDefault(x => x.Controls.Count == panels.Min(t => t.Controls.Count));

            dragDropPanel?.AddControl(control, (sender, args) =>
            {
                //mouseDown
                var panel = control.Parent;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                panel.Dock = DockStyle.None;
                panel.BringToFront();
                _oldPosition = panel.Parent.Name;
            }, (sender, args) =>
            {
                //mouseUp
                var panel = control.Parent;
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                panel.BringToFront();
                if (panel.Parent.Name != _oldPosition)
                {
                    var newIndex = int.Parse(dragDropPanel.Name);
                    _action?.Invoke(newIndex, control);
                }
            }, (sender, args) =>
            {
                //mouseMove
                var panel = control.Parent;
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);

                    // next dragdroppanel
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (_content.Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = _content.Controls[panelIndex + 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                                panel.BringToFront();
                            }
                        }
                    }
                    // previous dragdroppanel
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (_content.Controls.Count > panelIndex - 1 && panelIndex > 0)
                        {
                            dragDropPanel = _content.Controls[panelIndex - 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                                panel.BringToFront();
                            }
                        }
                    }
                }
            });
        }

        public void Reset()
        {
            _header.Controls.OfType().ToList().ForEach(x => x.Dispose());
            _content.Controls.OfType().ToList().ForEach(x => x.Dispose());
            _header.Controls.Clear();
            _content.Controls.Clear();
        }

        public void SetHandler(Action action)
        {
            _action = action;
        }
    }

    [ToolboxItem(false)]
    internal class DragDropPanel : Panel
    {
        public IEnumerable Child => Controls.OfType().
            Select(x => x.Controls.OfType().FirstOrDefault(t => t.Dock != DockStyle.Left));

        public void AddControl(Control control,
            MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
        {
            new Thread(() => Invoke(new EventHandler((sender, args) =>
            {
                var panel = new Panel
                {
                    Size = new Size(Width, control.Height),
                    Dock = DockStyle.Top
                };
                var header = new Panel
                {
                    Dock = DockStyle.Left,
                    Width = 12,
                    BackgroundImage = Resources.arrow_move,
                    BackgroundImageLayout = ImageLayout.Zoom
                };
                Controls.Add(panel);
                panel.Controls.Add(header);
                panel.Controls.Add(control);

                control.Dock = DockStyle.Fill;
                control.BringToFront();
                panel.BringToFront();

                header.MouseDown += mouseDown;
                header.MouseUp += mouseUp;
                header.MouseMove += mouseMove;
            })))
            {IsBackground = true}.Start();
        }

        protected override void InitLayout()
        {
            base.InitLayout();
            AutoScroll = true;
        }
    }
}



Foydalanish

dragDropContainer1.ColumnCount = 5;
var linkLabel = new LinkLabel
                {
                    Name ="test1",
                    Text = "Ism Familiya"
                };
dragDropContainer1.Add(linkLabel, 1);
dragDropContainer1.Headers.FirstOrDefault().Text = "1-soha";
dragDropContainer1.Headers.ToArray()[2].Text = "2- soha";
dragDropContainer1.SetHandler((i, control) =>
            {
                MessageBox.Show(string.Format("{0},{1}", i, (control as LinkLabel)?.Text));
                var position = dragDropContainer1.Child;
            });

Friday, March 11, 2016

C# windows formada sodda Drag & Drop. 2- versiya

Bu versiyada panellar tartiblandi. Tartib chapdan o`ngga davom etadi.
DragDropContainer ga kiritilgan controllar qaysi o`rinda turgani ham ko`rish mumkin.


Keyingi versiyada har bir harakatni, biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolamiz va unga Action bajartiramiz. So`ng bu DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ladi.

using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace ControlsLibrary.Controls
{
    public class DragDropContainer : Control
    {
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        public int ColumnCount { get; set; }
        public IEnumerable> Child => Controls.OfType().Select(x => x.Child);

        protected override void InitLayout()
        {
            base.InitLayout();

            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Right
                };
                Controls.Add(panel);
            }
            SizeChanged +=
                (o, args) =>
                {
                    Controls.OfType().ToList().ForEach(x => { x.Width = Width / ColumnCount; });
                };
        }

        public void Add(Control control, int? position = null)
        {
            var panels = Controls.OfType().ToArray();
            var dragDropPanel = position.HasValue
                ? panels[position.Value]
                : panels.FirstOrDefault(x => x.Controls.Count == panels.Min(t => t.Controls.Count));

            dragDropPanel?.AddControl(control, (sender, args) =>
            {//mouseDown
                var panel = control.Parent;
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                panel.Dock = DockStyle.None;
            }, (sender, args) =>
            {//mouseUp
                var panel = control.Parent;
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                panel.BringToFront();
            }, (sender, args) =>
            {//mouseMove
                var panel = control.Parent;
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);

                    // next dragdroppanel
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = Controls[panelIndex + 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                            }
                        }
                    }
                    // previous dragdroppanel
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex - 1 && panelIndex > 0)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            dragDropPanel?.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            });
        }
    }

    public class DragDropPanel : Panel
    {
        public LinkedList Child { get; } = new LinkedList();

        public void AddControl(Control control,
            MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
        {
            var panel = new Panel
            {
                Size = new Size(Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

            control.Dock = DockStyle.Fill;
            control.BringToFront();
            panel.BringToFront();

            header.MouseDown += mouseDown;
            header.MouseUp += mouseUp;
            header.MouseMove += mouseMove;

            Child.AddLast(control);
        }
    }
}


Foydalanish:

void Main(){
              var mainForm = new DragDropContainer
                {
                    Dock = DockStyle.Fill,
                    ColumnCount = 5
                };
                panel.Add(mainForm, "Home");
                mainForm.Add(new Button(),2);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                var items = mainForm.Child;
}

Thursday, March 10, 2016

C# windows formada sodda Drag & Drop. 1- versiya

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Library.Controls
{
    public partial class DragDropContainer : UserControl
    {
        public DragDropContainer()
        {
            InitializeComponent();
        }

        public int ColumnCount { get; set; }

        private void DragDropContiner_Load(object sender, EventArgs e)
        {
            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Left
                };
                Controls.Add(panel);
            }
            SizeChanged += (o, args) =>
            {
                Controls.OfType().ToList().ForEach(x =>
                {
                    x.Width = Width / ColumnCount;
                });
            };
        }
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        private Control _temp;
        public void Add(Control control)
        {
            var panels = Controls.OfType();
            var minControlsCount = panels.Min(x => x.Controls.Count);
            var dragDropPanel = panels.FirstOrDefault(x => x.Controls.Count == minControlsCount);
            var panel = new Panel
            {
                Size = new Size(dragDropPanel.Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            dragDropPanel.Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

            control.Dock = DockStyle.Fill;
            control.BringToFront();
            panel.BringToFront();

            header.MouseDown += (sender, args) =>
            {
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                _temp = panel;
                panel.Dock = DockStyle.None;
            };
            header.MouseUp += (sender, args) =>
            {
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                _temp = null;
                panel.BringToFront();
            };
            header.MouseMove += (sender, args) =>
            {
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex - 1)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                            }
                        }
                    }
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = Controls[panelIndex + 1] as DragDropPanel;
                            dragDropPanel.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            };
        }
    }
    public class DragDropPanel : Panel
    {
    }
}

Sunday, July 19, 2015

XML formatdan JSON formatiga o`tkazish (example)

foydalanish:

public static T Get(string body){
       body.XmlToObject();
}
 dasturning kodi
internal static class XmlJsonExt
    {
        public static T Deserialize(this string data)
        {
            return JsonConvert.DeserializeObject(data);
        }
        public static T XmlToObject(this string data)
        {
            return CreateDocument(data).XmlToJson().Deserialize();
        }
        #region Utils
        private static XmlDocument CreateDocument(string body)
        {
            var document = new XmlDocument();
            document.InnerXml = body;
            return document;
        }
        private static string XmlToJson(this XmlDocument xmlDoc)
        {
            var sbJson = new StringBuilder();
            sbJson.Append("{ ");
            XmlToJsoNnode(sbJson, xmlDoc.DocumentElement, true);
            sbJson.Append("}");
            return sbJson.ToString();
        }
        //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
        private static void XmlToJsoNnode(StringBuilder sbJson, XmlElement node, bool showNodeName)
        {
            if (showNodeName)
                sbJson.Append("\"" + SafeJson(node.Name) + "\": ");
            sbJson.Append("{");
            // Build a sorted list of key-value pairs
            //  where   key is case-sensitive nodeName
            //          value is an ArrayList of string or XmlElement
            //  so that we know whether the nodeName is an array or not.
            var childNodeNames = new SortedList();
            //  Add in all node attributes
            if (node.Attributes != null)
                foreach (XmlAttribute attr in node.Attributes)
                    StoreChildNode(childNodeNames, attr.Name, attr.InnerText);
            //  Add in all nodes
            foreach (XmlNode cnode in node.ChildNodes)
            {
                if (cnode is XmlText)
                    StoreChildNode(childNodeNames, "value", cnode.InnerText);
                else if (cnode is XmlElement)
                    StoreChildNode(childNodeNames, cnode.Name, cnode);
            }
            // Now output all stored info
            foreach (string childname in childNodeNames.Keys)
            {
                var alChild = (ArrayList) childNodeNames[childname];
                if (alChild.Count == 1)
                    OutputNode(childname, alChild[0], sbJson, true);
                else
                {
                    sbJson.Append(" \"" + SafeJson(childname) + "\": [ ");
                    foreach (var child in alChild)
                        OutputNode(childname, child, sbJson, false);
                    sbJson.Remove(sbJson.Length - 2, 2);
                    sbJson.Append(" ], ");
                }
            }
            sbJson.Remove(sbJson.Length - 2, 2);
            sbJson.Append(" }");
        }
        //  StoreChildNode: Store data associated with each nodeName
        //                  so that we know whether the nodeName is an array or not.
        private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
        {
            // Pre-process contraction of XmlElement-s
            if (nodeValue is XmlElement)
            {
                // Convert   into "aa":null
                //          xx into "aa":"xx"
                var cnode = (XmlNode) nodeValue;
                if (cnode.Attributes.Count == 0)
                {
                    var children = cnode.ChildNodes;
                    if (children.Count == 0)
                        nodeValue = null;
                    else if (children.Count == 1 && (children[0] is XmlText))
                        nodeValue = ((XmlText) (children[0])).InnerText;
                }
            }
            // Add nodeValue to ArrayList associated with each nodeName
            // If nodeName doesn't exist then add it
            var oValuesAl = childNodeNames[nodeName];
            ArrayList valuesAl;
            if (oValuesAl == null)
            {
                valuesAl = new ArrayList();
                childNodeNames[nodeName] = valuesAl;
            }
            else
                valuesAl = (ArrayList) oValuesAl;
            valuesAl.Add(nodeValue);
        }
        private static void OutputNode(string childname, object alChild, StringBuilder sbJson, bool showNodeName)
        {
            if (alChild == null)
            {
                if (showNodeName)
                    sbJson.Append("\"" + SafeJson(childname) + "\": ");
                sbJson.Append("null");
            }
            else if (alChild is string)
            {
                if (showNodeName)
                    sbJson.Append("\"" + SafeJson(childname) + "\": ");
                var sChild = (string) alChild;
                sChild = sChild.Trim();
                sbJson.Append("\"" + SafeJson(sChild) + "\"");
            }
            else
                XmlToJsoNnode(sbJson, (XmlElement) alChild, showNodeName);
            sbJson.Append(", ");
        }
        // Make a string safe for JSON
        private static string SafeJson(string sIn)
        {
            var sbOut = new StringBuilder(sIn.Length);
            foreach (var ch in sIn)
            {
                if (Char.IsControl(ch) || ch == '\'')
                {
                    int ich = ch;
                    sbOut.Append(@"\u" + ich.ToString("x4"));
                    continue;
                }
                if (ch == '\"' || ch == '\\' || ch == '/')
                {
                    sbOut.Append('\\');
                }
                sbOut.Append(ch);
            }
            return sbOut.ToString();
        }
        #endregion
    }

C# Windows Formsda controllarni asynchrone usulda qo`shish

Odatsa asynchrone usulda controllarni formada joylashtirganda xatolik yuz beradi, ammo bunday qilmasa dastur sekin ishlashi tabiiy(agar katta dastur bo`lsa)

Buning yo`li oson:

Extention yozib olamiz ,

public static class ControlExt
    {
public static void Asynch(this TControl control, Action action)
            where TControl : Control
        {
            if (control.InvokeRequired)
                control.Invoke(action, control);
            else
                action(control);
        }
}

Extentionimiz tayyor, endi istagan yerda asynchrone usulda qo`shaveramiz,

   content.Asynch(delegate (Panel panel)
            {
                panel.Add(new Malumotnoma
                {
                    Name = "malumotnoma",
                    Dock = DockStyle.Fill,
                    EmployeeCode = Code
                }, "Malumotnoma");
            }); 

SQLite ma`lumotlar ba`zasini boshqarish tizimida qo`shimcha funksiya(custom function)lardan foydalanish

   Sqlite da atigi bir nechta funksiya bor, oddiy dasturlar uchun bu yetarli. Lekin murakkabroq so`rovlarni tuzish uchun bu albatta kamlik qiladi. Shu sababli Sqlite o`ziga qo`shimcha funksiya yozib undan keng foydalanishimiz uchun darvozalarini ochib qo`ygan.

   Biz istan tipdagi funksiyani qo`shib, unga maxsus logikani ishlatishimiz mumkin. Bu funksiyalar yacheykalar bo`yicha har bir ustun uchun alohida tepadan pastga qarab ishlaydi.
Aggregate funksiyalar 1 dona natija qaytaradi(masalan: sum, min, max,avg, count,..), Scalar funksiyalar satrlarning soniga teng natija qaytaradi.(length, lower, upper, day, year,...)

Foydalanish tartibi:

1. Yangi funksiyamizni Connection dan ro`yxatdan o`tkazamiz

_connection.BindFunction(new Lower());
2. Yangi funksiya tanasi
using System; using System.Data.SQLite; namespace SQLite.CustomFunction {     [SQLiteFunction(Name = "lower", Arguments = 1, FuncType = FunctionType.Scalar)]     public sealed class Lower : SQLiteFunction     {         public override object Invoke(object[] args)         {             return args.Length > 0 ? (args[0].ToString() ?? "").ToLower() : null;        }     } }
Sqliteda lower funksiyasi bor, ammo u krill harfi uchun ishlamaydi, bizni yangi funksiyamiz  Sqlite ning funksiyasini qayta yuklaydi(override, overload). Esda tuting: Bu so`rov sqlite browserida ishlamaydi, chunki uning kodida bu funksiya yo`q, faqat bizning ulanish usluniimizdagi ro`yxatga olingan dasturimizda ishlaydi

Saturday, June 28, 2014

Sonlarni so`zlarga aylantiradigan kichik va oson dastur


/**
 * Created by Virus on 6/28/2014.
 */
public class Simple {

    public static void main(String[] args) {

        String text = "346836873469720";

        String[] a = {"", "bir", "ikki", "uch", "to`rt", "besh", "olti", "yetti", "sakkiz", "to`qqiz"};
        String[] b = {"", "o`n", "yigirma", "o`ttiz", "qirq", "ellik", "oltmish", "yetmish", "sakson", "to`qson"};
        String[] c = {"", "ming", "million", "milliard", "trillion"};

        StringBuffer buffer = new StringBuffer();

        for (int i = 0; i < text.length(); i++) {

            if ((text.length() - i) % 3 == 0) {

                buffer.append(a[Integer.valueOf(text.substring(i, i + 1))]);
                buffer.append(" yuz ");
            } else if ((text.length() - i) % 3 == 1) {

                buffer.append(a[Integer.valueOf(text.substring(i, i + 1))]);
                buffer.append(" ");
                int h = text.length() / 3 - i / 3 - 1;
                buffer.append(c[h < 0 ? 0 : h]);
                buffer.append(" ");
            } else if ((text.length() - i) % 3 == 2) {

                buffer.append(b[Integer.valueOf(text.substring(i, i + 1))]);
                buffer.append(" ");
            }
        }

        System.out.print(buffer);
    }
}