2

我想要一些漂亮的输出,它结合了几个已格式化并放入一行的本地宏

我尝试了多种不同的配置,但这基本上是我想要的

loc number1 = 12.20645161
loc number2 = 52.81451247
di "something here"

期望的输出:“数字 1 是 12.2065,数字 2 是 52.8145”

我可以格式化单个本地宏:

di %12.4f `number1'

我可以连接两个未格式化的宏:

di "number 1 is `number1' and number 2 is `number1'"

但似乎不能同时做到这两点。有没有办法尽早格式化宏或进行一些内联​​格式化或将格式化的字符串相互附加?

4

2 回答 2

4

你已经走了很多路,但这里也有一些误解。

从可以为本地宏分配格式的意义上说,您不能格式化本地宏。您正在做的是告诉display使用一种格式来显示该宏的值,但宏本身不受影响并且格式不会粘住。事实上,宏和格式在任何严格意义上都没有关联。这完全是display命令将您的指令放在一起,显示什么以及如何显示它的问题。

这与许多其他语言中的类似命令没有根本区别。

一种解决方案是

loc number1 12.20645161
loc number2  52.81451247
di "number 1 is " %5.4f `number1' "and number 2 is " %5.4f `number2' 

请注意,省略 = 符号会将数字分配为字符串等价物;没有以这种方式转换为二进制并返回十进制。在此示例中,差异不会产生影响。

进一步说明:

  1. round()像瘟疫一样避开这里。格式化问题的解决方案是格式化,而不是数字运算。它会在很多时候起作用,但不能保证。它不能保证你总是想要什么,因为几乎所有的十进制数字都不能完全保存为二进制,而且有时会咬人。

  2. 你可以这样做

    local nice1 : di %5.4f `number1' 
    local nice2 : di %5.4f `number2' 
    di "number 1 is `nice1' and number 2 is `nice2'" 
    

这也没有指定格式,但它是您寻求的字符串操作。

考虑它的方式是:宏保存字符串。当您想将字符串作为字符串进行操作时,请仅使用字符串操作。

于 2013-02-10T11:25:10.310 回答
0

好的,所以我发现编辑宏的唯一方法是提前进行一些格式化。因此,您可以在变量上调用 round() 到 .01 小数点并保存它,而不是将格式 %4.2f 应用于行中的宏。然后它将作为显示的一部分正确显示。但是,您可以内联格式化变量元素,但不需要任何连接符号(+ 或 &)来执行此操作。

sysuse auto
// get price difference
loc p_inc = (price[2] - price[1]) / price[2] * 100
// preformat local macro
loc p_inc = round(`p_inc',.01)
// format variables inline
di "price of car 2 (" %-5.0fc price[2] ") is `p_inc '% bigger than price of car 1 (" %-5.0fc price[1] ")"

输出:汽车 2 的价格(4,749)比汽车 1 的价格(4,099)高 13.69%

于 2013-02-10T04:57:11.353 回答