Pastable Numeric Edit Control

I've noticed several postings lately concerning the lack of customized edit controls that handle pasting. This numeric edit control handles pasting. There are settings within the control for the number of decimal places to allow, whether to include commas, a prefix string, and a suffix string. When in display mode (i.e. not active), the control displays the number formatted with a prefix, suffix, comma, and # decimal places. When in edit mode, the control displays only the number value for the control- checking that all inputs are valid numeric characters.

I wrote this control to replace the boring edit controls we were using for entering numbers. I have included source files, a demo project, and a demo executable for this control.

I hope someone else can get some use out of this code, too. :-)

Display Mode

Edit Mode

How to include in your project

  1. Copy NumEdit.cpp and NumEdit.h into your project directory.
  2. Add NumEdit.cpp and NumEdit.h to your project.

How to use

  1. Create an edit control on your dialog.
  2. Declare a variable in your dialog class, like this:
    cNumericEditCtrl m_NumericEdit;
  3. In OnInitDialog, call SubclassDlgItem, like this:
    m_NumericEdit.SubclassDlgItem(IDC_NUMERIC_EDIT, this); // Use your edit control ID here
  4. Set the prefix, suffix, # decimals, and whether commas should be displayed using the following member functions:
    void SetAttributes(short NumDecimalPlaces, BOOL DisplayCommas = TRUE);
    void SetPrefix(CString Prefix);
    void SetSuffix(CString Suffix);
  5. Set (optional) and retrieve the numeric value within your dialog as needed using the following member functions:
    double GetNumericValue();
    void SetNumericValue(double NumericValue);

Download compiled demo app (no project files) - 89 KB

Download demo (project files) - 14 KB

Download source - 4 KB



Comments

  • a fatal bug

    Posted by Legacy on 08/30/2003 12:00am

    Originally posted by: hbAi

    if a number such as 0.032 is typed in a text box ,when the box lose focus, the number 0.032 will be multiply 10^m_NumDecimalPlaces, i.e when m_NumDecimalPlaces is 3 the number will be 32 in the text box which lose focus.

    • a coorection

      Posted by rachid1245 on 10/09/2007 08:36am

      Hi everybody, Before excuse me for my bad English the problem in "a fatal bug" refers to the function SetNumericText(BOOL ShowFormatting) in fcvt(m_NumericValue,m_NumDecimalPlaces,&decimal,&sign)decimal can be <0, so in for(loop=0;loop Reply

    Reply
  • ExEditors Library

    Posted by Legacy on 03/19/2002 12:00am

    Originally posted by: Mike Philips

    A complete collection of editors in a single file:
    
    

    http://www.exontrol.com/sg.jsp?content=products/exeditors

    Regards,
    Mike

    Reply
  • There is deen for checking "-" (minus), if it is already used.

    Posted by Legacy on 06/25/2001 12:00am

    Originally posted by: Avtandil Adamia

    There are small bug.
    
    In the Function DoesCharacterPass you are cheking "-" (minus) only by position.
    If I will enter minus at the position 0, after this set cursor at the position 0 and agayn enter "-" (minus),
    I will have result --1234.0000

    Thanks.
    Avtandil Adamia.

    Reply
  • OnKillFocus - small bug

    Posted by Legacy on 04/11/2001 12:00am

    Originally posted by: Whitney Arnold

    Thanks for the code.  I was able to use this in my project but I did have to fix one small bug which probably doesn't occur much.  This has to do with when the control looses and gains focus.
    
    

    In the OnKillFocus, you get the value in the edit box and use atof to convert that to a double to store in m_NumericValue. However, if the edit text is still using the suffix or a prefix, atof cannot handle that and returns 0, so the control looses its value. Here's my version of OnKillFocus to get around that. This is probably not the cleanest code, but it does work.

    void
    CSliderNumericEditCtrl::OnKillfocus()
    {
    CString workstr, str, temp;
    double value;
    int nLength;

    GetWindowText(str);
    // Just in case there are extra spaces
    str.TrimLeft(); str.TrimRight();

    // First remove any prefix or suffix
    // before seeing there is a value
    workstr = str;
    if (!m_Prefix.IsEmpty()) {
    nLength = m_Prefix.GetLength();
    temp = str.Left(nLength);
    // Only remove the prefix if it is there,
    // it may have be removed during editing
    if (temp == m_Prefix)
    workstr = str.Mid (nLength);
    }
    if (!m_Suffix.IsEmpty()) {
    // In case there was a prefix as well
    str = workstr;

    // Only remove the stuffix if there,
    // it may have been removed during editing
    nLength = m_Suffix.GetLength();
    temp = str.Right(nLength);
    if (temp == m_Suffix)
    workstr = str.Left (str.GetLength() - nLength);
    }

    if(workstr.GetLength()>0) {
    m_HasValue = TRUE;
    } else {
    m_HasValue = FALSE;
    return;
    }

    // properly round and convert
    value = atof(workstr);
    value = RoundToDecimal(value, m_NumDecimalPlaces);

    // Set member value
    m_NumericValue = value;

    // Set text with formatting if selected
    SetNumericText(TRUE);
    }

    Reply
  • Notifications: problem solved

    Posted by Legacy on 03/25/1999 12:00am

    Originally posted by: Roel Schroeven

    The dialog that owns the control didn't receive notifications for EN_KILLFOCUS, EN_SETFOCUS and EN_CHANGE. That problem is now solved. Here are the changes you need to apply to make it work:

    Change ON_CONTROL_REFLECT to ON_CONTROL_REFLECT_EX for the three notifications in the message map in NumEditC.cpp. Change the type of the three message handler functions in NumEditC.h from afx_msg void to afx_msg BOOL, and from void to BOOL in NumEditC.cpp. Now edit the function bodies so that they return FALSE. That's it.

    Reply
  • EN_CHANGE Notification

    Posted by Legacy on 01/27/1999 12:00am

    Originally posted by: Steven M. McNeese

    I am unable to get notification for messages on the edit control. I tried mapping a function to the EN_CHANGE using the class wizard for the control on the dialog. What am I doing wrong?

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Instead of only managing projects organizations do need to manage value! "Doing the right things" and "doing things right" are the essential ingredients for successful software and systems delivery. Unfortunately, with distributed delivery spanning multiple disciplines, geographies and time zones, many organizations struggle with teams working in silos, broken lines of communication, lack of collaboration, inadequate traceability, and poor project visibility. This often results in organizations "doing the …

  • With JRebel, developers get to see their code changes immediately, fine-tune their code with incremental changes, debug, explore and deploy their code with ease (both locally and remotely), and ultimately spend more time coding instead of waiting for the dreaded application redeploy to finish. Every time a developer tests a code change it takes minutes to build and deploy the application. JRebel keeps the app server running at all times, so testing is instantaneous and interactive.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds