A numeric keypad for payment amount entry in C#

    0
    175

    Introduction

    For end users, it is much easier if they could just enter the digits from a numeric keypad and the currency format automatically applies, instead of entering a decimal point and digits!

    Background

    In many PoS software applications (or similar environments) a payment screen requires a “payment amount entry”. Payment values (currency) almost always include a decimal point. So, if we don’t handle the decimal point and leave it to the user it could (it will !) become a point of failure, when user enters more than one decimal point or simply adds the decimal point where it changes the total amount (A $10.25 payments becomes $102.50) So, you either have to check the value, or catch it at keypress level. A better method is to manage it at the entry point!

    Using the code

    On a Windows form add buttons and build your “Price numeric keypad”:

    Payment Coders - Price numeric kaypad

    I have used a TableLayoutPanel of 4×4.

    Add a Textbox under the keypad grid, where the output will be placed.

    I have introduced a public string, which decides what role our keypad will be playing:

    public string numberRole = "MONEY" ;

    “Money” role will set the satge for a payment value where a two digits decimal will be applied. For instance if the amount is 10.25, we will have the followings:

    step 1: 0.01

    step 2: 0.10

    step 3: 1.02

    step 4: 10.25

    “DIGITS” role will simply turn our keypad into a numeric, without decimal point.

    I also control the number of decimal points and also decimal digits(preset is 2).

    private void MakeAmount(string amountTxt)
    

    Is the key player in this code.

    private void MakeAmount(string amountTxt) { decimal meanWhile; txtValue.Text = txtValue.Text + amountTxt; if (txtValue.Text.Length == 1) { txtValue.Text = "0.0" + txtValue.Text; } if (txtValue.Text.Length > 4) { meanWhile = Convert.ToDecimal(txtValue.Text) * 10; txtValue.Text = meanWhile.ToString("G29"); } }
    

    As you can see depends on what we have, the decimal points gets moved.

    For every digit we have the same process:

    Except for zero, which we need to check a few things, all other Click events are similar:

    private void num2_Click(object sender, EventArgs e) { if (numberRole == "DIGITS") { txtValue.Text = txtValue.Text + "2" ; } else MakeAmount(num2.Text); }
    

    And for zero:

    private void num0_Click(object sender, EventArgs e) { decimal meanWhile; if (numberRole == "DIGITS") { txtValue.Text = txtValue.Text + "0"; } else { txtValue.Text = txtValue.Text + "0"; if (txtValue.Text.Length == 1) { txtValue.Text = "0.0" + txtValue.Text; } if (txtValue.Text.Length >= 4) { meanWhile = Convert.ToDecimal(txtValue.Text) * 10; txtValue.Text = meanWhile.ToString("G29"); } if (Convert.ToDecimal(txtValue.Text) < 1) { txtValue.Text = txtValue.Text + "0"; } if (txtValue.Text.IndexOf(".") < 0) { txtValue.Text = txtValue.Text + ".00"; } if (Convert.ToDecimal(txtValue.Text) > 1 && (txtValue.Text.Length - txtValue.Text.IndexOf(".") - 1 == 1)) { txtValue.Text = txtValue.Text + "0"; } } }
    

    This is how you call your price numeric keypad:

    numberpad showNumber = new numberpad(); showNumber.numberRole = "MONEY";
    

    As you can see this calls for a “Money” format.

    And if you need a numeric keypad, call your function with “DIGITS”:

    numberpad showNumber = new numberpad(); showNumber.numberRole = "DIGITS";
    

    LEAVE A REPLY