Dim*_*rov 1 stata stata-macros
我正在尝试编写一个命令,该命令返回一个四舍五入到小数点后两位的百分比标量。百分比可以为负数或正数,小数点前的位数未知。
这是 MRE,显示了我遇到的问题。
#delimit;
capture program drop my_note;
program my_note, eclass;
local my_x: display %-9.2f 92.23999999999999;
ereturn scalar my_x = `my_x';
end;
ereturn clear;
my_note;
ereturn list;
display %-9.2f 92.23999999999999;
display 92.23999999999999;
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么 display 似乎做了正确的事情(将 92.23999999999999 转换为 92.24,尽管无论格式如何),但 e(my_x) 似乎没有继承该格式。
当您创建标量时,您会复制 local 的值 `my_x'。该值仍然92.23999999999999不变: display,不会更改基础数据,只会更改其显示方式。可以将其视为5.00e+2和中的数据500是相同的,只是该值的显示方式有所不同。
您需要使用字符串来处理值的显示方式。但是,代码示例中的字符串存在两个问题。
虽然标量通常可以保存字符串和数值,但返回的标量不能保存字符串(不要问我为什么)。可以换回当地人吗?
在%-9.2f您指定显示格式为 9 个字符长时,您的标量将为e(my_x) : "92.24 ". 您可以调整%-9.2f,但由于您现在正在使用字符串,因此可以使用该trim()函数删除多余的空格。
尝试下面的代码,看看在给定这个函数的上下文中它是否有效。如果没有,请告诉我们更多有关您将要做什么的信息。
#delimit;
capture program drop my_note;
program my_note, eclass;
local my_x: display %-9.2f 92.23999999999999;
ereturn local my_x = trim("`my_x'");
end;
ereturn clear;
my_note;
ereturn list;
Run Code Online (Sandbox Code Playgroud)