以字符串形式显示和连接格式化的数字

时间:2013-02-10 03:19:26

标签: stata

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

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

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'"

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

2 个答案:

答案 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' 

请注意,省略=符号会将数字指定为字符串等效项;没有转换为二进制并返回到十进制的方式。在这个例子中,差异不会受到影响。

补充说明:

  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'" 
    
  3. 也没有分配格式,但它是你寻求的字符串操作。

    想到它的方法是:宏持有字符串。如果要将字符串作为字符串进行操作,请仅使用字符串操作。

答案 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%