文字列を実数型に変換することはできますか?


製品のバージョンによって異なります。


ISaGRAF Ver.4/5の場合
標準演算子 "ANY_TO_REAL" を使用して、文字列型を実数型のデータに変換することができますが、小数部分は失われます。また、数字以外の文字があらわれると、それ以降の文字は数字に変換されません。


123-> 123.0
123.456 -> 123.0
1/2 -> 1.0
5*8 -> 5.0
abc -> 0.0

対処方法としてはC言語ファンクションをつくってターゲットに実装するか、下記のようなの仕様のIECファンクションブロックを開発します。

<パラメータ>
パラメータ名
方向
コメント
StrInput STRING(255) 入力 変換元の文字列
RealOutput REAL 出力 変換後の実数
Status BOOL 出力 入力文字列を変換できなかった場合、FALSE
Zero BOOL ローカル 文字列の先頭が '0' の場合の値はTrue
Minus BOOL ローカル 文字列の先頭が '-' の場合の値はTrue
TempString1 STRING(255) ローカル -
TempString2 STRING(255) ローカル -
TempReal1 REAL ローカル -
TempReal2 REAL ローカル -
TempReal3 REAL ローカル -
StrLength DINT ローカル 入力文字列の長さ
Index DINT ローカル -
Code DINT ローカル アスキーコードチェック用
OneChar STRING(2) ローカル -

<プログラム(ST言語で記述)>
Status := TRUE; (* 文字列を実数型に変換できたかどうかのフラグ *)
StrLength := MLEN(StrInput);
If (StrLength = 0) then (* 空文字列? *)
    Status := FALSE;
end_if;
Index := 0;
While (Index < StrLength AND Status = TRUE) Do
    Index := Index + 1;
    Code := ASCII(StrInput, Index);
    if (Code <> 45 AND (* '-'マイナス記号でない *)
    Code <> 46) Then (* '.'小数点記号でない *)
      If (Code < 48 OR Code > 58) Then (* '0'~'9'の文字でない *)
        Status := FALSE;
      End_If;
    End_If;
End_While;

if (Status) then
    TempString1 := replace(StrInput , '', 1, find(StrInput , '.'));
    Zero := TRUE;
    Minus := FALSE;
    TempString2 := TempString1;
    While (Zero) Do
      OneChar := Left(TempString2,1);
      if (OneChar = '0') then
        TempString2 := Delete(TempString2,1,1); (* '0'を削除 *)
      elsif (OneChar = '-') then
        Minus := TRUE;
        TempString2 := Delete(TempString2,1,1); (* '-'を削除 *)
      else
        Zero := FALSE; (* 最初の '0' ではない文字があった *)
      end_if;
    End_While;
    If (Minus) then
      TempString2 := Insert(TempString2,'-',1); (* '-' を戻す*)
    End_if;

    TempReal1 := expt(10.0, (mlen(StrInput )-find(StrInput ,'.')));
    TempReal2 := trunc(TempReal1);
    TempReal3 := ANY_TO_REAL(TempString2);
    RealOutput := TempReal3 / TempReal2;
Else
    RealOutput := 0.0;
End_If;
最終更新:
2008-07-30 10:46
改訂:
1.0
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

このカテゴリー内のレコード

タグ