问题:TwinCAT3当中,将实数转换成字符串的科学计数法格式改成小数格式的函数
回答:

FUNCTION ConvertScientificToDecimal : STRING

VAR_INPUT

num : LREAL; 

END_VAR

VAR

    count : INT := 0; // 循环次数,记录在num大于等于1之前乘以10的次数

    strNum : STRING; // 用于保存转换后的字符串

    strNumNoDot  : STRING; // 不带小数点的字符串

iDotPos : INT; // 小数点的位置

    dotIndex : INT; // 小数点的索引位置

    i : INT; // 用于循环

zeros : STRING; // 0的个数

END_VARIF ABS(num) < 1.0 THEN


    // 通过循环将小数点右移,直到num大于等于1

    WHILE ABS(num) < 1.0 DO

        num := num * 10;

        count := count + 1;

    END_WHILE;

    

    // 将num转换为字符串

    strNum := LREAL_TO_STRING(num);

IF num <0 THEN 

strNum := DELETE(strNum, 1, FIND(strNum,'-'));

ELSE

strNum := strNum;

END_IF

iDotPos := FIND(strNum, '.');

IF  ((FIND(strNum, '.0') <>0  AND ( LEN(strNum) - iDotPos) = 1)) THEN   

    strNumNoDot :=DELETE(strNum,2,iDotPos);

  ELSE

   // 找到小数点的索引位置

    dotIndex := FIND(strNum,'.');

    

    // 删除小数点

    strNumNoDot := DELETE(strNum, 1, dotIndex);

END_IF

    


    // 构建由零组成的字符串

    zeros := '';

    FOR i := 1 TO count - 1 DO

        zeros := CONCAT(zeros, '0');

    END_FOR

IF num > 0 THEN

    // 构建最终的字符串

      strNum := CONCAT('0.', CONCAT(zeros, strNumNoDot));

 

ELSIF num < 0 THEN

strNum := CONCAT('-0.', CONCAT(zeros, strNumNoDot));

ELSE

strNum := '0';

END_IF

ELSE

    // 如果num不小于1,直接转换为字符串

    strNum := LREAL_TO_STRING(num);

END_IF


// 返回最终的字符串

ConvertScientificToDecimal := strNum;


余洋 2024.3.11 编辑




数据维护:余洋
编辑时间:11 3月 2024

如果此回答有不清楚或错误的地方,请扫描页面底部二维码添加微信公众号与我们联系,我们努力给您满意的答复。