Reputation: 11471
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
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
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
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
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
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
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
Reputation: 23786
Just add:
if (Regex.IsMatch(textBox1.Text, @"\.\d\d")) {
e.Handled = true;
}
to the end of your function
Upvotes: 10
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