概要
$JUSTIFY は、指定した width 内で expression で指定した値を右寄せして返します。width 内で小数点を揃えるために、decimal 引数を使用できます。
-
$JUSTIFY(expression,width):引数が 2 つの構文では、expression を width 内で右寄せします。expression の変換は実行されません。expression には、数値、または非数値文字列を使用できます。
-
$JUSTIFY(expression,width,decimal):引数が 3 つの構文では、expression をキャノニック形式の数値に変換し、decimal まで小数桁を丸めるかゼロで埋めてから、結果となる数値を width 内で右寄せします。expression が非数値文字列または NULL の場合、InterSystems IRIS はそれを 0 に変換し、パディングしてから、右寄せします。
$JUSTIFY は、現在のロケールのための DecimalSeparator 文字を認識します。必要に応じて DecimalSeparator 文字を追加または削除します。DecimalSeparator 文字はロケールによって異なります。一般に、米国形式のロケール用のピリオドかヨーロッパ形式のロケール用のコンマ (,) のどちらかとなります。ユーザのロケールの DecimalSeparator 文字を決定するには、以下のメソッドを呼び出します。
WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
指定する引数が少なすぎると、SQLCODE -380 が発行されます。指定する引数が多すぎると、SQLCODE -381 が発行されます。
$JUSTIFY、ROUND、および TRUNCATE
固定の小数桁数への丸めが重要な場合、例えば金額を表す場合などは、$JUSTIFY を使用します。これは、丸め処理の後に指定された数の末尾のゼロを返します。decimal が expression の小数桁数より大きい場合、$JUSTIFY はゼロパディングを行います。また $JUSTIFY では、DecimalSeparator 文字が数値列内で揃うように数値が右寄せされます。
また ROUND では、指定された小数桁数への丸めを行いますが、その戻り値は常に正規化され、末尾のゼロが削除されます。例えば、ROUND(10.004,2) は 10.00 ではなく 10 を返します。$JUSTIFY とは異なり、ROUND では、丸め (既定) または切り捨てを指定できます。
TRUNCATE では、指定された小数桁数への切り捨てを行います。ROUND とは異なり、切り捨てによって末尾にゼロが生じた場合、これらの末尾のゼロは保持されます。ただし、$JUSTIFY とは異なり、TRUNCATE はゼロパディングを行いません。
ROUND および TRUNCATE では、小数点記号の左に丸める (または切り捨てる) ことができます。例えば、ROUND(128.5,-1) は 130 を返します。
$JUSTIFY および LPAD
引数が 2 つの形式の LPADおよび引数が 2 つの形式の $JUSTIFY はどちらも、先頭にスペースを使用してパディングすることで文字列を右寄せします。引数が 2 つのこれらの形式の違いは、入力 expression の長さより短い出力 width の扱い方です。LPAD は、指定された出力長に合わせて入力文字列を切り捨てます。$JUSTIFY は、入力文字列に合わせて出力長を拡大します。詳細は、以下の例を参照してください。
SELECT '>'||LPAD(12345,10)||'<' AS lpadplus,
'>'||$JUSTIFY(12345,10)||'<' AS justifyplus,
'>'||LPAD(12345,3)||'<' AS lpadminus,
'>'||$JUSTIFY(12345,3)||'<' AS justifyminus
引数が 3 つの形式の LPAD では、スペース以外の文字での左パディングが可能です。
例
以下のダイナミック SQL の例では、文字列に右寄せを実行します。数値変換は実行されません。
SET myquery = "SELECT TOP 20 Age,$JUSTIFY(Name,18),DOB FROM Sample.Person"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
以下のダイナミック SQL の例では、指定された小数桁数で数値の右寄せを実行します。
SET myquery = 2
SET myquery(1) = "SELECT TOP 20 $JUSTIFY(Salary,10,2) AS FullSalary,"
SET myquery(2) = "$JUSTIFY(Salary/7,10,2) AS SeventhSalary FROM Sample.Employee"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
以下のダイナミック SQL の例では、指定された小数桁数での数値の右寄せと、同じ数値の文字列の右寄せを実行します。
SET myquery = 2
SET myquery(1) = "SELECT $JUSTIFY({fn ACOS(-1)},8,3) AS ArcCos3,"
SET myquery(2) = "$JUSTIFY({fn ACOS(-1)},8) AS ArcCosAll"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
以下のダイナミック SQL の例では、$DOUBLE 値の INF および NAN を使用して数値の右寄せを実行します。
DO ##class(%SYSTEM.Process).IEEEError(0)
SET x=$DOUBLE(1.2e500)
SET y=x-x
SET myquery = 2
SET myquery(1) = "SELECT $JUSTIFY(?,12,2) AS INFtest,"
SET myquery(2) = "$JUSTIFY(?,12,2) AS NANtest"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute(x,y)
DO rset.%Display()