Форматирование десятичных строк и денежных значений (драйвер SQLSRV)

Скачать драйвер PHP

Чтобы сохранить точность, типы decimal или numeric всегда извлекаются как строки с особой точностью и масштабом. Если какое-либо значение меньше 1, начальный ноль отсутствует. Это аналогично полям money и smallmoney, так как они являются десятичными полями с фиксированным масштабом равным 4.

Добавление ведущих нулей, если они отсутствуют

Начиная с версии 5.6.0, параметр FormatDecimals добавляется на уровнях подключения sqlsrv и инструкции, что позволяет пользователю форматировать десятичные строки. Этот параметр принимает логическое значение (true или false) и влияет только на форматирование десятичных или числовых значений в результатах выборки. Иными словами, параметр FormatDecimals не влияет на другие операции, такие как вставка или обновление.

Значение FormatDecimals по умолчанию — false. Если задано значение true, то начальные нули в десятичных строках будут добавлены для любого десятичного значения меньше 1.

Настройка числа десятичных знаков

Если FormatDecimals включен, то параметр DecimalPlaces позволяет пользователям настраивать число десятичных знаков при отображении данных money и smallmoney. Он принимает целочисленные значения в диапазоне [0, 4] и может выполнять округление отображаемого числа. Однако базовые данные money остаются неизменными.

Для обоих параметров можно задать уровень подключения или инструкции, а параметр инструкции всегда переопределяет соответствующий параметр подключения. Обратите внимание, что параметр DecimalPlaces влияет только на данные money, а параметр FormatDecimals должен быть со значением true, чтобы параметр DecimalPlaces вступил в силу. В противном случае форматирование отключается независимо от параметра DecimalPlaces.

Примечание

Так как поля money или smallmoney имеют масштаб 4, то при установке значения DecimalPlaces любое отрицательное число или любое значение больше 4 будет игнорироваться. Не рекомендуется использовать какие-либо отформатированные данные money в качестве входных данных для вычислений.

Пример. Простая выборка

В следующем примере показано, как использовать новые параметры в простой выборке.

<?php
$username = 'myusername';
$password = 'mypasword';
$tableName = 'mytable';

$connectionInfo = array("UID" => $username, "PWD" => $password, "Database" => "myDB", "FormatDecimals" => true);  
$server = "myServer";  // 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);
?>

Пример. Форматирование параметра вывода

Если десятичное или числовое поле возвращается в качестве параметра вывода, то возвращаемое значение будет рассматриваться как обычная строка типа 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
}

См. также:

Форматирование десятичных строк и денежных значений (драйвер PDO_SQLSRV)

Извлечение данных