我想要一些漂亮的输出,它结合了几个已经格式化并放入一行的本地宏
我尝试了多种不同的配置,但这基本上就是我想要的
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'"
但似乎无法同时做到这两点。有没有办法尽早格式化宏或进行一些内联格式化或相互附加格式化的字符串?
答案 0 :(得分: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'
请注意,省略=符号会将数字指定为字符串等效项;没有转换为二进制并返回到十进制的方式。在这个例子中,差异不会受到影响。
补充说明:
像瘟疫一样避免round()
。格式化问题的解决方案是格式,而不是数字操作。它会在很多时候起作用,但不能保证。它不能完全保证你想要的东西,因为几乎所有的十进制数字都不能完全像二进制数一样,有时会咬人。
你可以这样做
local nice1 : di %5.4f `number1'
local nice2 : di %5.4f `number2'
di "number 1 is `nice1' and number 2 is `nice2'"
也没有分配格式,但它是你寻求的字符串操作。
想到它的方法是:宏持有字符串。如果要将字符串作为字符串进行操作,请仅使用字符串操作。
答案 1 :(得分:0)
好的,所以我发现编辑宏的唯一方法是提前做一些格式化。因此,不是将格式%4.2f应用于行中的宏,而是可以将变量上的round()调用到.01小数点并保存。然后它将作为显示的一部分正确显示。但是,您可以内联格式化可变元素,但不需要任何连接符号(+或&)来执行此操作。
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%