2013-02-10 71 views
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'" 

,但似乎無法同時做兩個。有沒有辦法格式化宏,或者做一些內聯格式化或將格式化的字符串追加到對方?

+1

這是一個非常令人驚喜的驚喜。謝謝(預期中)! – 2016-01-20 13:05:11

回答

4

你是個不錯的的方式出現的價格更大的13.69%,但這裏也有一些誤解太多。

您無法格式化本地宏,因爲您可以將格式分配給本地宏。你在做什麼就是告訴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'" 
    

,不能正常分配的格式,但它是你所尋求的字符串操作。

想想它的方法是:宏持有字符串。當你想把字符串作爲字符串操作時,只能使用字符串操作。

+0

謝謝,使用round()更像是一種解決方案,而不是解決方案,因爲我希望將展示與基礎值分開。你能否詳細說明冒號操作員告訴STATA的內容。我之前沒有看到它,我不確定我能否在此背景下抽象出它的用法。謝謝 – KyleMit 2013-02-10 16:04:30

+1

從'help macro'開始。然後看看擴展功能的東西。這是有據可查的。 – 2013-02-10 20:58:32

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(4749)的價格比汽車1(4,099)