2

フォーマットされて1行にまとめられたいくつかのローカルマクロを組み合わせたきれいな出力が欲しいです

複数の異なる構成を試しましたが、基本的には次のようにします

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

必要な出力:「番号1は12.2065、番号2は52.8145」

単一のローカルマクロをフォーマットできます。

di %12.4f `number1'

そして、2つのフォーマットされていないマクロを連結できます。

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

しかし、両方を同時に行うことはできないようです。マクロを早期にフォーマットしたり、インラインフォーマットを実行したり、フォーマットされた文字列を相互に追加したりする方法はありますか?

4

2 に答える 2

4

あなたはそこまでの道のりはたくさんありますが、ここにもいくつかの誤解があります。

ローカルマクロにフォーマットを割り当てることができるという意味で、ローカルマクロをフォーマットすることはできません。あなたがしていることはdisplay、そのマクロの値を表示する際にフォーマットを使用するように指示していますが、マクロ自体は影響を受けず、フォーマットは固執しません。実際、マクロとフォーマットが厳密な意味で関連付けられることはありません。それは完全displayにあなたの指示をまとめるコマンド、何を表示するか、そして正確にそれをどのように表示するかという問題です。

これは、他の多くの言語の同様のコマンドと基本的に違いはありません。

1つの解決策は

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

=記号を省略すると、数字は文字列に相当するものとして割り当てられることに注意してください。その方法で2進数に変換して10進数に戻すことはありません。この例では、違いはありません。

その他の注意事項:

  1. round()疫病のようにここを避けてください。フォーマットの問題の解決策はフォーマットであり、数値演算ではありません。多くの場合動作しますが、保証されているわけではありません。ほとんどすべての10進数をバイナリとして正確に保持することはできず、場合によっては噛み付くことがあるため、常に必要なものが正確に保証されるわけではありません。

  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

さて、マクロを編集する唯一の方法は、事前にフォーマットを行うことです。したがって、行のマクロにフォーマット%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%高い

于 2013-02-10T04:57:11.353 に答える