使用CAtlRegExp正则表达式检查浮点数输入

一、VS2008(Sp1)环境使用CAtlRegExp类需要额外下载ATL Server,(因为开源代码,没集成在VS2008里了) http://atlserver.codeplex.com/

二、下载后解压,如F:\CPP\ATL_Server_Source_and_Headers_9_0_70425_Alpha
然后设置路径:【工具】->【选项】->【项目和解决方案】->【VC++目录】,在【包含文件】添加目录 F:\CPP\ATL_Server_Source_and_Headers_9_0_70425_Alpha\include

三、使用方法

    (1)、h文件中

包含头文件  
            #include <atlrx.h>
变量
CString m_szPixels;
float m_nPixels;
定义函数
static CString REError2String(REParseError status);


    (2)、CPP实现文件
主要代码添加在DoDataExchange();

void CPageMeasument::DoDataExchange(CDataExchange* pDX)
{
        CPropertyPage::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT1, m_szPixels);
        DDX_Text(pDX, IDC_EDIT2, m_nDefaultZoomFactor);
        DDX_Control(pDX, IDC_COMBO_UNITS, m_cboUnits);

       CString szErr(_T("Parser Error:"));

        if ( pDX->m_bSaveAndValidate ) {
        // create regular expression content
        CAtlRegExp<> regex;
        REParseError status = regex.Parse(L"^{[-+]?\\d+}{\\.}?{\\d*}{[eE][-+]?\\d+}?$");   
        if (REPARSE_ERROR_OK != status) {
        // invalid pattern, show error
                     szErr += REError2String(status);
        } else {
        // valid regex pattern, now try to match the content
        CAtlREMatchContext<> mc;
        if (!regex.Match(m_szPixels, &mc)) {
                // content not match
                m_szPixels = _T("");
                m_nPixels = -1;
        } else {
                // content match, show match-group like this
                // for (UINT nGroupIndex = 0; nGroupIndex < mc.m_uNumGroups; ++nGroupIndex)
                // {
                // const CAtlREMatchContext<>::RECHAR* szStart = 0;
            // const CAtlREMatchContext<>::RECHAR* szEnd = 0;
            // mc.GetMatch(nGroupIndex, &szStart, &szEnd);
            // ptrdiff_t nLength = szEnd - szStart;
            // CString text(szStart, nLength);
            //                                       //text是各个拆开后的字符串,可以打印出来
            // }

            m_nPixels  = (float)_tstof((const wchar_t*)m_szPixels.GetBuffer(0));
            }
        }
               //print error message "szErr" here  
              //AfxMessageBox(szErr);              
        }
}

定义错误函数
CString CPageMeasument::REError2String(REParseError status)
{
        switch (status) {
        case REPARSE_ERROR_OK: return TEXT("No error occurred");
        case REPARSE_ERROR_OUTOFMEMORY: return TEXT("Out of memory");
        case REPARSE_ERROR_BRACE_EXPECTED: return TEXT("A closing brace was expected");
        case REPARSE_ERROR_PAREN_EXPECTED: return TEXT("A closing parenthesis was expected");
        case REPARSE_ERROR_BRACKET_EXPECTED: return TEXT("A closing bracket was expected");
        case REPARSE_ERROR_UNEXPECTED: return TEXT("An unspecified fatal error occurred");
        case REPARSE_ERROR_EMPTY_RANGE: return TEXT("A range expression was empty");
        case REPARSE_ERROR_INVALID_GROUP: return TEXT("A back reference was made to a group that did not exist");
        case REPARSE_ERROR_INVALID_RANGE: return TEXT("An invalid range was specified");
        case REPARSE_ERROR_EMPTY_REPEATOP: return TEXT("A repeat operator (* or +) was applied to an expression that could   be empty");
        case REPARSE_ERROR_INVALID_INPUT: return TEXT("The input string was invalid");
        default: return TEXT("Unknown error");
}
}


最后在需要的地方添加UpdateData()函数(它会调用DoDataExchange)
void CPageMeasument::OnOK()
{

UpdateData(TRUE);

if ((m_nPixels <= 0) && (BST_CHECKED==((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck()))
{
        CRect rect;
        GetDlgItem(IDC_EDIT1)->GetWindowRect(&rect);
        CPoint pt = rect.CenterPoint(); pt.x = rect.right-15;
        m_tooltip.SetDirection(PPTOOLTIP_LEFTEDGE_TOP);
        m_tooltip.ShowHelpTooltip(&pt, _T("<center><h2>Check input</h2><br><hr color=blue></center><br>You maybe enter a illegal values"));
        return ;
}

if ((m_cboUnits.GetCurSel() <  0)  && (BST_CHECKED==((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck()) )
{
CRect rect;
GetDlgItem(IDC_COMBO_UNITS)->GetWindowRect(&rect);
CPoint pt = rect.CenterPoint(); pt.x = rect.right-15;
m_tooltip.SetDirection(PPTOOLTIP_LEFTEDGE_TOP);
m_tooltip.ShowHelpTooltip(&pt, _T("<center><h2>Check input</h2><br><hr color=blue></center><br>Select a units"));
return ;
}

CPropertyPage::OnOK();
}


四、说明
这里检测浮点数的正则表达式式子是 ^{[-+]?\\d+}{\\.}?{\\d*}{[eE][-+]?\\d+}?$ ,本来语法是 ^([-+]?\d+)(\.)?(\d*)([eE][-+]?\d+)?$
使用CAtlRegExp类需要将()改成{}才行,列外C++代码里面\要用转义字符 \\ 表示,所以\d 写成\\d

L"^{[-+]?\\d+}{\\.}?{\\d*}{[eE][-+]?\\d+}?$"  表示是Unicode字符串,前面加个L 修饰

这个正则表达式表示的浮点数可以是:
-.2   -0.2   +0  +0.   +.2   1.23    -1.23   +1.23e-3    +1.23E+3  -1.23e-5   123  123.     123.e-3
等等各种合法浮点数。。

列外在这个网站http://regexlib.com/ 可以搜到很多现成的一些正则表达式。。。。。。。。。

五、结果,检测非法输入
 

 

图片



 

 

图片

 


 

六、为什么要正则表达式来检测输入的字符串,而不直接给Edit定义一个float变量,因为第一为了美观,UpdataDate()时如果输入非法会弹出一些很丑的对话框,而且输入也不怎么好。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分频时钟与使能时钟

分频时钟与使能时钟 对于资源比较丰富的FPGA&#xff0c;一般都有内嵌的多个PLL或者DLL专门用于时钟管理&#xff0c;利用他们就可以很容易地达到多个时钟的设计&#xff0c;输出时钟能够配置成设计者期望的不同频率和相位差&#xff08;相对于输入时钟&#xff09;&#xff0…

王重敏的“中国主义”

王重敏是我非常尊敬的画家。他是江南人&#xff0c;却生活在大北方&#xff0c;所以我以为他的性格中融合了南北地域的不同气韵。南方的细腻温和与北方的粗犷大气不仅显现在他的为人和性情之中&#xff0c;也体现在他的笔墨之间。他深得前辈大师傅抱石、黄显之、陈之佛的真传&a…

阿梅尔的“福娃”

女儿参加一个少年画展&#xff0c;画了两幅关于奥运的画&#xff0c;颇有意思。前者是《奥运三剑客》&#xff0c;将奥运福娃做了幽默的装扮。其中的海盗形象显然是受了电影《加勒比海盗》的影响。尤其是海盗特有的蒙眼布&#xff0c;以及木腿&#xff0c;很有创意&#xff0c;…

怎么避免UpdateData()函数弹出对话框

一个Edit控件在关联一个int 变量什么的时候&#xff0c;用UpdateData()函数跟新数据时&#xff0c;如果Edit上什么都它会弹出对话框来。。 看起来挺丑的&#xff0c;怎么避免呢&#xff1f;一个就是用Get(Set)WindowText()函数更新数据&#xff0c;有的有这样的方法&#xff1a…

基本的Testbench的搭建

基本的Testbench的搭建 对被测试设计的顶层接口进行例化。给被测试设计的输入接口添加激励。判断被测试设计的输出响应是否满足设计要求。testbench中的例化应该把input转换成reg,因为待测试设计的输入值是由testbench决定的。相应的output就应该转换成wire,因为待测试设计的…

鹤峰:美丽的茶乡——人物篇

前几天&#xff0c;我来到湖北省的鹤峰县&#xff0c;参加首届茶叶节暨鹤峰特色文化旅游文学笔会。鹤峰县位于湖北省西部的恩施土家族、苗族自治州境内&#xff0c;与湖南的张家界比邻&#xff0c;属于偏远的少数民族地区。但是这里山川秀丽&#xff0c;民风淳朴&#xff0c;尤…

鹤峰:美丽的茶乡—— 山水篇

龙渊峡是鹤峰山水中的一绝&#xff0c;它是躲避峡入口处的一段。 乘船进入龙渊峡&#xff0c;眼睛只看到一线天。目前峡中正在开辟漂流的探险旅游项目。 来参加茶叶节的宾客来到鹤峰县走马乡的茶山&#xff0c;参观了满山遍野的茶叶。

CMFCTabCtrl 切换页面闪烁问题

WinXPVS2008&#xff08;SP1&#xff09;环境 在对话框界面创建了一个CMFCTabCtrl &#xff0c;加了四个页面&#xff0c;但是切换页面时总有闪烁现象。 解决办法是页面的类里面响应 afx_msg BOOL OnEraseBkgnd(CDC* pDC); 这个函数&#xff0c;并将生成的代码 return CDialog…

流水线设计的概念

流水线设计的概念 它是面积换取速度思想的又一种具体现。 所谓流水线设计实际上是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器并暂存中间数据。 流水线处理是提高组合逻辑设计的处理速度和吞吐量的常用手段。如果某个组合逻辑设计的处理流程可以分为…

鹤峰:美丽的茶乡—— 舞狮篇

白果村的狮灯班是鹤峰民间艺术的一个名片。我有幸看到了他们的表演。舞狮者跳到三层桌子上&#xff0c;做出各种高难惊险动作&#xff0c;舞姿优美&#xff0c;鬼斧神工&#xff0c;令人叹为观止。 尾声是狮子咬住一个红色的布卷&#xff0c;然后徐徐展开&#xff0c;于是鹤峰茶…

数据接口同步的同步方法

数据接口同步的同步方法 前级(如另外一个芯片、PCB布线、驱动接口元件)输出的延时是随机的,或者有可能变动,如何在后级完成数据的同步?对于随机到达的数据,需要建立同步机制。可以采用使数据通过RAM或者FIFO的缓存仔读取的方法,达到数据同步的目的。将前级芯片提供的时钟…

MFC中绘制高亮的图标 VC图标填充半透明色

高亮的图标即使一个图标看起来有一层半透明的颜色填充一样&#xff0c;如下图选中的哪行文字的图标有层透明色&#xff0c;这个小问题我搜遍了整个因特网都没找到答案&#xff0c;还是自己解决了&#xff0c;留个记号。。。 //Code snippets//......//m_ImgList是个CImageList变…

《觉建筑》《斑点狗眼里的世界》首发式

由同心出版社出版的《觉建筑》和《斑点狗眼里的世界》近日在郑州举行的全国书市上首发。《觉建筑》的作者曾哲是北京作家协会专业作家&#xff0c;为撰写《觉建筑》一书&#xff0c;曾哲潜心四年&#xff0c;研读了大量国内外建筑和建筑理论书籍&#xff0c;采访了国内众多的建…

推荐華麗の真実的小说《The★Sakuray》

这是90后人写的小说&#xff0c;转于此,之于是什么类小说&#xff0c;或者说是不是小说&#xff0c;写的好与不好&#xff0c;请诸位看官评判。 http://vip.book.sina.com.cn/book/index_56840.html

利用task和电平敏感的always快设计经比较后重组信号的组合逻辑

规则: 若用于任务中的命名变量或参数没有在任务块中声明,则指的是在模块中声明的命名变量或参数。任务中的input,output和inout的个数不受限制(也可以为零个)。任务中的变量(包括输入和双向端口(inout)可以声明为寄存器型。如果没有明确地声明,则默认为寄存器型,且位宽…

VC动态链接数据库类ADOConn

//环境Windows XP SP3VS2010 UNICODE//头文件ADOConn.h#pragma once #import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace \rename("EOF","adoEOF") rename("BOF","adoBOF")class ADOConn{publi…

密云一日的无色影像

密云一个村的街口。 养蜂人家门前的小狗。 两个游荡街头的小男生。

一只紧握笔的手:地震中的感人图片之二

新华社发&#xff08;刘忠俊 摄&#xff09; 在一座学校的废墟中伸出来一只手。这是一只孩子的手。这只手的指甲已经变黑&#xff0c;手上皮肤也开始腐烂。这是一只已经失去生命的手&#xff0c;但是却紧紧地握住一支笔。在地震发生的那一瞬间&#xff0c;也许他正在课堂上认真…

tftp服务器连接开发板下载内核提示:retry count exceeded; starting again

今天&#xff0c;进Ubuntu连开发板调试程序&#xff0c;不能够连接开发板下载内核了&#xff0c;各种重启也没用&#xff0c;最后百度发现此帖子&#xff0c;一语惊醒梦中人&#xff0c;原来我在windows中把无线网卡禁用了&#xff0c;进入win打开无线功能&#xff0c;再进Ubun…

function函数的使用

function函数的使用 规则: 函数必须至少含有一个输入变量&#xff0c;不能有任何输出或输入/输出双向变量。函数不能包含时钟控制语句&#xff08;如延迟#、事件控制或者等待wait&#xff09;。函数是通过对函数名赋值的途径返回其值的&#xff0c;就好比是一个寄存器。函数不…