Delphi中用状态图对字符串数据进行类型判断

Delphi中用状态图对字符串数据进行类型判断

 

在我们写程序时总是会遇到对字符串进行数据类型判断,:整型,浮点型等。而我们可是用状态图<1>的方法来对字符串数据进行类型判断。

对字符串进行类型判断我们一般需要对它进行解析,在解析过程中我们需要标识出它现在的状态和下次它可以出现在状态,如整型,浮点型。在解析完后我们可以得出它最后的状态,这样我们对它的类型判断的结果就是它那个最后的状态,通过这个我们可以达到举一反三的效果。

                                                              

                                                                     1

图中有五个小圆圈表示五种状态(虚线的圆圈表示中间状态,实线圆圈表示最终状态。当然还有一种状态我没有画出来:非数据类型),它们分别是:StateInit(开始)StateDiag(符号)stateDot(小数点),StateInt(整型),stateFloat(浮点型),箭头表示字符串的解析流程,长方型表示解析的每个字符。

我们举个例子来说说吧!如字串:”-19.2”。把它解析成‘-’→‘1’→‘9’→‘.’→‘2’。根据图1:开始状态为stateInit,解析第一个字符‘- →得到它的状态为StateDiag,

解析第二个字符‘1 →得到它的状态为StateInt,解析字符‘9 →得到它的状态为StateInt,解析字符‘。’→得到它的状态为StateFloat→得到它最后的状态为StateFloat。这样我们就得到了最终结果:这个字符串对应的是浮点型的数据。下面是Delphi源码<仅供参考>:

{******************************

//author = py

//time = 20/06/04

//function = Is integer(float) or not in string;

*******************************}

unit Pfunction;

 

interface

//uses windows;

{*result: 0. Integer

 *        1. float

 *       -1. error}

function isNumberOrFloat(aEnterStr: PChar): Integer;

implementation

 

 

 

function isNumberOrFloat(aEnterStr: PChar): integer;

   function isNumber(aNum: char): boolean;

   begin

      result := false;

      if (aNum >= '0') and (aNum <= '9') then

        result := true;

   end;

   function isSymbol(aNum: char): boolean;

   begin

     result := false;

     if ((aNum = '+') or (aNum = '-')) then

       result := true;

   end;

   function isDot(aNum: char): boolean;

   begin

     result := false;

     if (aNum = '.') then

       result := true;

   end;

type TStateBit = (STATEINIT, STATEINT, STATEDIAG,

          STATEDOT, STATEFLOAT, ERROR);   //static enum

var  mCh: char;          // char of string

     mI: integer;       //circle num

     mInx: integer;    //length of string;

     mState: TStateBit ; //current state

begin

   mInx := Length(aEnterStr);

   mState := STATEINIT;

   result := -1;

 

   for mI := 0 to mInx-1 do

   begin

      mCh := aEnterStr[mI];

      case mState of

        STATEINIT:begin

                    if isNumber(mCh) then  begin

                      mState := STATEINT;

                    end

                    else if (isSymbol(mCh)) then begin

                       mState := STATEDIAG;

                    end

                    else if isDot(mCh) then  begin

                       mState := STATEDOT;

                    end

                    else mState := ERROR;

 

                  end;

        STATEINT: begin

                    if isDot(mCh) then begin

                      mState := STATEFLOAT;

                    end

                    else if (isNumber(mCh))then begin

                      mState := STATEINT;

                    end

                    else mState := ERROR;

                  end;

        STATEDIAG:begin

                    if isNumber(mCh) then  begin

                       mState := STATEINT;

                    end

                    else if isDot(mCh) then begin

                      mState := STATEDOT;

                    end

                    else mState := ERROR;

                  end;

        STATEDOT: begin

                    if isNumber(mCh) then begin

                      mState := STATEFLOAT;

                    end

                    else mState := ERROR;

                  end;

        STATEFLOAT:begin

                     if isNumber(mCh) then  begin

                       mState := STATEFLOAT;

                     end

                     else mState := ERROR;

                   end;

      end;

   end;

   if (mState = STATEINT) then result := 0

   else if (mState = STATEFLOAT) then result := 1;

end;

 

end.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

men_nang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值