zoukankan      html  css  js  c++  java
  • DuiLib的EditBox要求输入格式为decimal(18,4) DEFAULT NULL限制用户输入

    在XML文件中已经配置EditBox输入的基本限制如下:

     <HorizontalLayout height="30">
        <Label text="规模:" float="true" pos="30,0,0,0" width="80" height="22"/>
        <Edit name="EditRaiseValue" align="right" float="true" pos="110,0,0,0" font="2" height="25" width="150" decimal="true" thousand="true" digits="2" />
        <Label text="元" float="true" pos="261,0,0,0" width="15" height="22"/>
        <Label text="*" float="true" pos="280,0,0,0" width="10" height="22" textcolor="0xFFFF0000"/>
        <Label text="负责人:" float="true" pos="360,0,0,0" width="80" height="22"/>
        <Edit name="EditChiefName" float="true" pos="440,0,0,0" font="2" height="25" width="150" maxchar = "24"/>
     </HorizontalLayout>
    

    现有代码使得用户可以无限制输入无限制长度的double类型数据导致数据无法保存数据库。在::Notify(TNotifyUI& msg)代码中增加判断如下:

        else if (msg.sType == DUI_MSGTYPE_TEXTCHANGED)
        {        
            if (msg.pSender->GetInterface(DUI_CTR_EDIT) )
            {
                CEditUI *pEdit = static_cast<CEditUI*>(msg.pSender);
                            
                if (pEdit->IsNeedThousands())
                {
                    _tstring strtText = pEdit->GetText();
                    int nCurrHiSel = pEdit->GetHignSel();
                    int nRLen = strtText.length() - nCurrHiSel;
                    auto itremove = std::remove_if(strtText.begin(), strtText.end(), [](TCHAR &c)
                    {
                        return c == ',';
                    });
                    strtText.erase(itremove, strtText.end());
                    int nPos = strtText.find('.');
                    int precision = strtText.length() - nPos - 1;
                    //限制整数部分的输入长度,输入或复制的超限则截断
    if (nPos < 0) { precision = 0;
                       if (strtText.length() > 14)
                        {
                            strtText.erase(strtText.end() - 1);
                        }
    }
                    else if (nPos > 14)
                    {
                        strtText.erase(strtText.begin() + 14, strtText.begin() + nPos);
                    }
    else if (strtText.length() - nPos > 2) { //precision = pEdit->GetDigits(); } auto raise_value = _ttof(strtText.c_str()); auto strFormat = Format_thousands_separator(raise_value, precision); if (nPos == strtText.length() - 1) { strFormat += "."; } pEdit->SetText(C22<255>(strFormat.c_str())); pEdit->SetSel(strFormat.length() - nRLen, strFormat.length() - nRLen); } } }

    若无xml配置的限制,建议使用正则表达式,此处不能用SetMaxChar限制输入长度,用输入覆盖方式较好。

    没有坚守就没有事业,没有执着就没有未来!
  • 相关阅读:
    VB C# 语法对比图 (代码实例)
    改进了的一个邮件发送类
    什么时候应该使用 ==?什么时候应该使用 Equals?
    c#写的贪吃蛇小游戏
    七招制胜ASP.NET应用程序开发
    SQL Server开发人员应聘常被问的问题汇总
    DataTable中数据记录的统计
    ASP.NET中数据库数据导入Excel并打印
    在.NET中得到计算机硬件信息的一些功能
    C#.NET 中的类型转换
  • 原文地址:https://www.cnblogs.com/depend-wind/p/8989254.html
Copyright © 2011-2022 走看看