將十進位字串及貨幣值格式化 (SQLSRV 驅動程式)

下載 PHP 驅動程式

為了保留精確度,decimal 或 numeric 類型一律會以字串形式擷取,並原樣保留其精度與小數位數。 如果任何值小於 1,則會遺漏前置零。 money 和 smallmoney 欄位也是如此,因為它們是小數位數固定為 4 的 decimal 類型欄位。

若遺漏前置零則加以新增

從 5.6.0 版開始,已將 FormatDecimals 選項新增至 sqlsrv 連線和陳述式層級,其可讓使用者格式化十進位字串。 此選項會預期布林值 (true 或 false),而且只會影響所擷取結果中十進位或數值的格式設定。 換句話說,FormatDecimals 選項不會影響插入或更新等其他作業。

根據預設,FormatDecimals 是 false。 如果設定為 true,則會將十進位字串的前置零新增至小於 1 的任何十進位值。

設定小數位數的數目

當 FormatDecimals 開啟時,另一個選項 DecimalPlaces 可讓使用者設定顯示 money 和 smallmoney 資料類型時的小數位數。 其接受範圍在 [0, 4] 內的整數值,而在顯示時可能會發生進位。 不過,底層的金錢資料仍維持不變。

這兩個選項都可設為連線層級或陳述式層級,而陳述式層級的設定一律優先於對應的連線層級設定。 請注意,DecimalPlaces 選項只會影響金額資料,且必須將 FormatDecimals 設定為 true,DecimalPlaces 才會生效。 否則,不論 DecimalPlaces 設定為何,格式設定都會關閉。

注意

因為 money 或 smallmoney 欄位的小數位數為 4,因此若將 DecimalPlaces 的值設為任何負數,或任何大於 4 的值,系統都會忽略。 不建議使用任何已格式化的金額資料作為任何計算的輸入資料。

範例 - 簡易擷取

下列範例將示範如何使用新的選項進行簡易擷取。

<?php
$username = '<user_id>';
$password = '<password>';
$tableName = 'mytable';

$connectionInfo = array("UID" => $username, "PWD" => $password, "Database" => "<database>", "FormatDecimals" => true);  
$server = "<server>";  // IP address also works
$conn = sqlsrv_connect( $server, $connectionInfo);  

$numDigits = 2;
$query = "SELECT money1 FROM $tableName";
$options = array("DecimalPlaces" => $numDigits);
$stmt = sqlsrv_prepare($conn, $query, array(), $options);
sqlsrv_execute($stmt);

if (sqlsrv_fetch($stmt)) {
    $field = sqlsrv_get_field($stmt, 0);  
    echo $field;   // expect a numeric value string with 2 decimal places
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

範例 - 格式化輸出參數

如果 decimal 或 numeric 欄位以輸出參數的形式傳回,系統會將傳回的值視為一般 varchar 字串。 不過,如果已指定 SQLSRV_SQLTYPE_DECIMAL 或 SQLSRV_SQLTYPE_NUMERIC,您可以將 FormatDecimals 設定為 true 以確保數值字串值沒有任何遺失的前置零。 如需詳細資訊,請參閱如何:使用 SQLSRV 驅動程式擷取輸出參數。

下列範例示範如何格式化傳回 decimal(8,4) 值之預存程序的輸出參數。

$outString = '';
$outSql = '{CALL myStoredProc(?)}';
$stmt = sqlsrv_prepare($conn, 
                       $outSql, 
                       array(array(&$outString, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_DECIMAL(8, 4))),
                       array('FormatDecimals' => true));

if (sqlsrv_execute($stmt)) {
    echo $outString;  // expect a numeric value string with no missing leading zero
}