user710502
user710502

Reputation: 11471

Only allow two digits after decimal in textbox?

I have a textbox where the user enters a number, but how can i make it so that if they type the '.' after it it only allows 2 decimal places?

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (!char.IsControl(e.KeyChar)  
        && !char.IsDigit(e.KeyChar)  
        && e.KeyChar != '.') 
    { 
        e.Handled = true; 
    } 

    // only allow one decimal point 
    if (e.KeyChar == '.'  
        && (sender as TextBox).Text.IndexOf('.') > -1) 
    { 
        e.Handled = true; 
    } 
}

Upvotes: 6

Views: 46616

Answers (8)

wacman
wacman

Reputation: 1

I've just started to learn Windows programming and C# and I was looking for a way to allow entry of +ve decimal values with a set number of digits after the decimal. I've put it in a class library as I'll use it in other apps. Hopefully this will help someone else starting on their C# journey. The answers above helped me write what I was looking for - This is what I ended up with

// Usage : [TextBox].KeyPress += new KeyPressEventHandler(TxtHandlers.txtBox_KeyPress_DecimalValues);
//         Pecision is stored as a string in the [TextBox].Tag property
public static void txtBox_KeyPress_DecimalValues(object sender, KeyPressEventArgs e)
{
    TextBox tb = sender as TextBox;

    // Block anything other than Control Characters, Digits, Decimal Points, and dash for negative values
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.' && e.KeyChar != '-'))
    {
        e.Handled = true;
    }

    // Block Dash if we're not at the start of the string 
    if (e.KeyChar == '-' && tb.SelectionStart > 0) 
    {
            e.Handled = true;
    }

    // Block decimal point if one already exists
    if (e.KeyChar == '.' && tb.Text.IndexOf('.') > -1)
    {
        e.Handled = true;
    }

    // Check if precision stored in tb.Tag - Tag should be an Integer Value
    if (tb.Tag != null && int.TryParse(tb.Tag.ToString(), out int i))
    {
        // Split string into an array at the decimal points
        string[] decSplits = tb.Text.Split('.');
        // Have we got any decimals
        if (decSplits.Length > 1)
        {
            // Block additional digits but allow control keys eg backspace etc
            if (decSplits[1].Length >= int.Parse(tb.Tag.ToString()) && !char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }
    }
}

Upvotes: 0

Ravi Sharma
Ravi Sharma

Reputation: 370

<asp:TextBox ID="txtTotalMarks" ClientIDMode="Static" runat="server" onkeypress="return isNumberKey(event,this)"></asp:TextBox>
function isNumberKey(evt, element) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57) && !(charCode == 46 || charCode == 8))
        return false;
    else {
        var len = $(element).val().length;
        var index = $(element).val().indexOf('.');
        if (index > 0 && charCode == 46) {
            return false;
        }
        if (index > 0) {
            var CharAfterdot = (len + 1) - index;
            if (CharAfterdot > 3) {
                return false;
            }
        }

    }
    return true;
}

Upvotes: 0

MrValvis
MrValvis

Reputation: 137

Personaly I am using this, Its not very elegant but works like a charm. This script restrict user to use only numeric characters, only 1 dot ,just 2 decimal numbers and backspace.

so acceptable inputs will be something like : 1.22 , 2135.25, 3535.5 etc.

void Decimal(object sender, KeyPressEventArgs Event) {
            Event.Handled = true;
            bool FalseInput = !char.IsControl(Event.KeyChar) && !char.IsDigit(Event.KeyChar) && !char.IsControl(Event.KeyChar) && Event.KeyChar != 8 && Event.KeyChar != '.';
            if (!FalseInput){
                Event.Handled = false;
                if (Regex.IsMatch(FreightTextBox.Text, @"^\d+\.\d*$") && Event.KeyChar != 8) {
                    bool ContainDot = FreightTextBox.Text.Contains(".");
                    Event.Handled = true;
                    if (ContainDot && Event.KeyChar != 8 && Event.KeyChar!='.'){
                        Event.Handled = Regex.IsMatch(FreightTextBox.Text, @"\.\d\d");
                    }
                }
            }
        }

Upvotes: 0

walther
walther

Reputation: 13600

I believe MaskedTextBox class may help you.

More info here: https://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox(v=vs.110).aspx

If it doesn't suit your situation, you can always write yourself a validation and/or a custom control.

Here's an example of a Numeric TextBox: http://msdn.microsoft.com/en-us/library/ms229644(v=vs.80).aspx#Y0

Upvotes: 0

Scott
Scott

Reputation: 157

Just wanted to point out that the accepted answer will not allow you to enter any numbers BEFORE the decimal point either once that criteria has been met.

None of the other current examples will work either because they are not getting cursor position

If you still want to use keypress event you could re-factor your code as follows:

string senderText = (sender as TextBox).Text;
string senderName = (sender as TextBox).Name;
string[] splitByDecimal = senderText.Split('.');
int cursorPosition = (sender as TextBox).SelectionStart;

if (!char.IsControl(e.KeyChar) 
    && !char.IsDigit(e.KeyChar) 
    && (e.KeyChar != '.'))
{
    e.Handled = true;
}


if (e.KeyChar == '.' 
    && senderText.IndexOf('.') > -1 )
{
    e.Handled = true;
}


if (!char.IsControl(e.KeyChar) 
    && senderText.IndexOf('.') < cursorPosition 
    && splitByDecimal.Length > 1 
    && splitByDecimal[1].Length == 2)
{
    e.Handled = true;
}

Alternatively, use TextChanged event and do the following and it will work:

string enteredText = (sender as TextBox).Text;
int cursorPosition = (sender as TextBox).SelectionStart;

string[] splitByDecimal = enteredText.Split('.');

if(splitByDecimal.Length > 1 && splitByDecimal[1].Length > 2){
    (sender as TextBox).Text = enteredText.Remove(enteredText.Length-1);
    (sender as TextBox).SelectionStart = cursorPosition - 1;
}

Upvotes: 4

pradeep
pradeep

Reputation: 1

namespace WindowsFormsApplication10
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "";
        double no;
        no = double.Parse(textBox1.Text);

        string[] ones = new string[19] {"one ","two ","three ","four ","five ","six ","seven ","eight ","nine ","ten ","eleven ","twele ",
                                        "thiten ","fourten ","fiften ","sixten ","seventeen ","eighteen ", "ninteen "};
        string[] tens = new string[9] { "ten ", "twenty ", "thirty ", "fourty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninty " };

        int i=0;




        if (no > 999 & no < 100000)
        {
            i = (int)no / 1000;
            if (i < 20)
                label1.Text = label1.Text + ones[i - 1] + "";
            else if (i > 20)
            {
                int r = 0;
                r = i % 10;
                i = i / 10;
                label1.Text = label1.Text + tens[i - 1] + "";
                label1.Text = label1.Text + ones[r - 1] + "";

            }

            label1.Text = label1.Text + "thousand ";
            no = no % 1000;
        }

        if (no > 99 & no < 1000)
        {
            i = (int)no / 100;
            label1.Text = label1.Text + ones[i - 1] + "hundred ";
            no = no % 100;
        }
        if (no > 19 & no < 99)
        {
            i = (int)no / 10;
            label1.Text = label1.Text + tens[i - 1];
            no = no % 10;
        }
        if (no > 0 & no < 20)
        {
            label1.Text = label1.Text + ones[(int)no-1] + " ";
        }
        label1.Text = label1.Text + "Rupees ";


    }

    private void button2_Click(object sender, EventArgs e)
    {
        textBox1.Text = "";
        label1.Text = "";
        textBox1.Focus();

    }

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {

        if (!char.IsControl(e.KeyChar)
     && !char.IsDigit(e.KeyChar)
     && e.KeyChar != '.')
        {
            e.Handled = true;
        }

        // only allow one decimal point 
        if (e.KeyChar == '.'
            && (sender as TextBox).Text.IndexOf('.') > -1)
        {
            e.Handled = true;
        }
        string word = textBox1.Text.Trim();
        string[] wordArr = word.Split('.');
        if (wordArr.Length > 1)
        {
            string afterDot = wordArr[1];
            if (afterDot.Length > 1)
            {

                e.Handled = true;
            }
        }

    }
}
}

here is the program you need.

Upvotes: 0

aquinas
aquinas

Reputation: 23786

Just add:

if (Regex.IsMatch(textBox1.Text, @"\.\d\d")) {
   e.Handled = true;
}

to the end of your function

Upvotes: 10

Shyju
Shyju

Reputation: 218722

string word=txtPrice.Text.Trim();
string[] wordArr=word.Split('.');
if(wordArr.Length>1)
{
   string afterDot=wordArr[1];
   if(afterDot.Length>2)
   {
    alert("Only 2 allowed");
    txtPrice.Text=wordArr[0]+"."+afterDot.SubString(0,2);  
   } 
}

Upvotes: 1

Related Questions