/// <summary>
        /// repostion SelectionStart, recalculate SelectedLength
        /// </summary>
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);

            if (ReadOnly)
            {
                return;
            }

            if (e.KeyChar == (char)13 || e.KeyChar == (char)3 || e.KeyChar == (char)22 || e.KeyChar == (char)24)
            {
                return;
            }

            if (m_decimalLength == 0 && e.KeyChar == m_decimalSeparator)
            {
                e.Handled = true;
                return;
            }

            if (!m_allowNegative && e.KeyChar == m_negativeSign && base.Text.IndexOf(m_negativeSign) < 0)
            {
                e.Handled = true;
                return;
            }

            if (!char.IsDigit(e.KeyChar) && e.KeyChar != m_negativeSign && e.KeyChar != m_decimalSeparator)
            {
                e.Handled = true;
                return;
            }

            if (base.Text.Length >= m_MaxValueLength && e.KeyChar != m_negativeSign)
            {
                e.Handled = true;
                return;
            }

            if (e.KeyChar == m_decimalSeparator || e.KeyChar == m_negativeSign) // will position after dot(.) or first
            {
                SelectionLength = 0;
            }

            var isNegative = base.Text[0] == m_negativeSign ? true : false;

            if (isNegative && SelectionStart == 0)
            {
                SelectionStart = 1;
            }

            if (e.KeyChar == m_negativeSign)
            {
                var selStart = SelectionStart;

                if (!isNegative)
                {
                    base.Text      = m_negativeSign + base.Text;
                    SelectionStart = selStart + 1;
                }
                else
                {
                    base.Text = base.Text.Substring(1, base.Text.Length - 1);
                    if (selStart >= 1)
                    {
                        SelectionStart = selStart - 1;
                    }
                    else
                    {
                        SelectionStart = 0;
                    }
                }
                e.Handled = true; // minus(-) has been handled
                return;
            }

            var dotPos = base.Text.IndexOf(m_decimalSeparator) + 1;

            if (e.KeyChar == m_decimalSeparator)
            {
                if (dotPos > 0)
                {
                    SelectionStart = dotPos;
                }
                e.Handled = true; // dot has been handled
                return;
            }

            if (base.Text == "0")
            {
                BaseText.SelectAll(); //清除默认0
                //this.SelectionStart = 0;
                //this.SelectionStart = 1;  // replace thre first char, ie. 0
            }
            else if (base.Text == m_negativeSign + "0")
            {
                SelectionStart  = 1;
                SelectionLength = 1; // replace thre first char, ie. 0
            }
            else if (m_decimalLength > 0)
            {
                if (base.Text[0] == '0' && dotPos == 2 && SelectionStart <= 1)
                {
                    SelectionStart  = 0;
                    SelectionLength = 1; // replace thre first char, ie. 0
                }
                else if (base.Text.Substring(0, 2) == m_negativeSign + "0" && dotPos == 3 && SelectionStart <= 2)
                {
                    SelectionStart  = 1;
                    SelectionLength = 1; // replace thre first char, ie. 0
                }
                else if (SelectionStart == dotPos + m_decimalLength)
                {
                    SelectionStart -= 1;
                    SelectionLength = 1; // last position after text
                }
                else if (SelectionStart >= dotPos)
                {
                    SelectionLength = 1;
                }
                else if (SelectionLength == dotPos + m_decimalLength)
                {
                    ClearSelection();
                    SelectionStart  = 0;
                    SelectionLength = 1;
                }
            }
        }