TextToFloat                 函数         将字符串(以NULL结束的格式)转换为浮点数 

解决方案 »

  1.   

    进行一次转换即可知道:
    Edit1.text := CurrToStr(StrToCurr(Edit1.text));
    如果出错了,说明输入的不是Currency类型了,如果必须要real类型,
    再进行一次强制类型转化Real(StrToCurr(Edit1.text))
      

  2.   

    可以用sscanf()从string中读float.
      

  3.   

    //在EDIT1的OnKeyPress事件中
    procedure frmMain.Edit1OnKeyPress(Sender:TObject;Char:Word);
    Begin
      Try
        StrToFloat(Edit1.Text);
      except
      Begin
        ShowMessage('输入的不是浮点数');
        Char :=#0;
      end;
    end;
      

  4.   

    还是不让用户输入的好,在keypress事件中判断接收参数key的值,如下:
    if not (key in ['0'..'9','+','-','.']) then key:=chr(0);
      

  5.   

    procedure  Proc_check(v_edit1:TEDIT;KEY:WORD);
    var
     i,v_len,v_flag:integer;
    begin
    // 键值说明
    // 48-57表示大键盘的数字键 '0-9'
    // 8 表示删除键
    // 12 表示小键盘上的 '5'
    // 45 表示小建盘上的 '0'
    // 33-40 表示小键盘上的数字96-105
    // 190 表示大键盘上的小数点 '.'
    // 46 表示小建盘上的小数点 '.'
    if key=13 then exit;
    if ((key>=48)and(key<=57)) or (key=8) or (key=12) or (key=45) or ((key>=33)and(key<=40)) or (key=190) or (key=46) or ((key>=96)and(key<=105))or (key=110)then
          v_edit1.ReadOnly:=false
    else
          begin
           v_edit1.readonly:=true;
           exit;
          end;
     v_len:=length(v_edit1.text);
     for i:=1 to v_len do
        if v_edit1.text[i]='.' then
           begin
            v_flag:=1;
            break;
           end;if ((v_edit1.text='')or(v_flag=1))and ((key=190)or(key=110)) then
     begin
       v_edit1.readonly:=true;
       exit;
     end;end;在edit1的keydown事件了加入
    proc_check(edit1,key);
      

  6.   

    其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!unit NumEdit;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls,Clipbrd;type
      TNumEdit = class(TEdit)
      private
        { Private declarations }
        FIsReal:boolean;
        function GetInteger:integer;
        procedure SetInteger(Value:integer);
        function GetReal:real;
        procedure SetReal(Value:real);
        procedure WMPaste(var Message: TMessage); message WM_PASTE;
      protected
        { Protected declarations }
        procedure KeyPress(var Key: Char); override;
      public
        { Public declarations }
        property AsInteger:integer read GetInteger Write SetInteger default 0;
        property AsReal:real read GetReal Write SetReal;
        constructor Create(AOwner:TComponent);override;
      published
        { Published declarations }
        property IsReal:boolean read FIsReal write FIsReal;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Edit', [TNumEdit]);
    end;{ TNumEdit }
    function TNumEdit.GetInteger: integer;
    var V,Code:integer;
    begin
       if not FIsReal then
       begin
          val(text,V,Code);
          if Code=0 then
             Result:=V
          else
             Result:=0;
       end
       else
          Result:=Round(GetReal);
    end;
    procedure TNumEdit.KeyPress(var Key: Char);
    var CharSet:set of char;
    begin
      if FIsReal then
         CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)]+['.']
      else
         CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)];  if not (char(key) in [^X ,^C]) then
         if (not (Key in CharSet)) then
         begin
            beep;
            Key := #0;
         end
         else
         begin
            if FIsReal then
               if (Key='.')and(pos('.',text)<>0)then
               begin
                  beep;
                  Key := #0;
               end;
         end;  inherited KeyPress(Key);
    end;procedure TNumEdit.SetInteger(Value:integer);
    begin
       text:=inttostr(Value);
    end;function TNumEdit.GetReal: real;
    var Code:integer;
        R:real;
    begin
       if not FIsReal then
          Result:=GetInteger
       else
       begin
          val(text,R,Code);
          if Code=0 then
             Result:=R
          else
             Result:=0;
       end;
    end;procedure TNumEdit.SetReal(Value:real);
    begin
       text:=floattostr(Value);
    end;constructor TNumEdit.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      Text:='0';
    end;procedure TNumEdit.WMPaste(var Message: TMessage);
    var Value:string;
        R:real;
        V,Code:integer;
    begin
        Clipboard.Open;
        Value := Clipboard.AsText;
        Clipboard.Close;    if Value='' then exit;    if IsReal then
        begin
          val(Value,R,Code);
          if Code=0 then
          begin
            if (Pos('.',SelText)<>0)
               or (Pos('.',Text)=0)
               or (Pos('.',Value)=0)
            then
              SelText:=floattostr(R);
          end;
        end
        else
        begin
          val(Value,V,Code);
          if Code=0 then SelText:=inttostr(V);
        end;
    end;end.
      

  7.   

    其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!unit NumEdit;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls,Clipbrd;type
      TNumEdit = class(TEdit)
      private
        { Private declarations }
        FIsReal:boolean;
        function GetInteger:integer;
        procedure SetInteger(Value:integer);
        function GetReal:real;
        procedure SetReal(Value:real);
        procedure WMPaste(var Message: TMessage); message WM_PASTE;
      protected
        { Protected declarations }
        procedure KeyPress(var Key: Char); override;
      public
        { Public declarations }
        property AsInteger:integer read GetInteger Write SetInteger default 0;
        property AsReal:real read GetReal Write SetReal;
        constructor Create(AOwner:TComponent);override;
      published
        { Published declarations }
        property IsReal:boolean read FIsReal write FIsReal;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Edit', [TNumEdit]);
    end;{ TNumEdit }
    function TNumEdit.GetInteger: integer;
    var V,Code:integer;
    begin
       if not FIsReal then
       begin
          val(text,V,Code);
          if Code=0 then
             Result:=V
          else
             Result:=0;
       end
       else
          Result:=Round(GetReal);
    end;
    procedure TNumEdit.KeyPress(var Key: Char);
    var CharSet:set of char;
    begin
      if FIsReal then
         CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)]+['.']
      else
         CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)];  if not (char(key) in [^X ,^C]) then
         if (not (Key in CharSet)) then
         begin
            beep;
            Key := #0;
         end
         else
         begin
            if FIsReal then
               if (Key='.')and(pos('.',text)<>0)then
               begin
                  beep;
                  Key := #0;
               end;
         end;  inherited KeyPress(Key);
    end;procedure TNumEdit.SetInteger(Value:integer);
    begin
       text:=inttostr(Value);
    end;function TNumEdit.GetReal: real;
    var Code:integer;
        R:real;
    begin
       if not FIsReal then
          Result:=GetInteger
       else
       begin
          val(text,R,Code);
          if Code=0 then
             Result:=R
          else
             Result:=0;
       end;
    end;procedure TNumEdit.SetReal(Value:real);
    begin
       text:=floattostr(Value);
    end;constructor TNumEdit.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      Text:='0';
    end;procedure TNumEdit.WMPaste(var Message: TMessage);
    var Value:string;
        R:real;
        V,Code:integer;
    begin
        Clipboard.Open;
        Value := Clipboard.AsText;
        Clipboard.Close;    if Value='' then exit;    if IsReal then
        begin
          val(Value,R,Code);
          if Code=0 then
          begin
            if (Pos('.',SelText)<>0)
               or (Pos('.',Text)=0)
               or (Pos('.',Value)=0)
            then
              SelText:=floattostr(R);
          end;
        end
        else
        begin
          val(Value,V,Code);
          if Code=0 then SelText:=inttostr(V);
        end;
    end;end.