Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para conservar la precisión, los tipos decimales o numéricos siempre se capturan como cadenas con precisiones y escalas exactas. Si cualquier valor es inferior a 1, falta el cero inicial. Lo mismo ocurre con los campos money y smallmoney, ya que son campos decimales con una escala fija igual a 4.
Adición de ceros iniciales si faltan
A partir de la versión 5.6.0, la opción FormatDecimals se agrega a los niveles de instrucción y conexión sqlsrv, permitiendo al usuario dar formato a las cadenas decimales. Esta opción espera un valor booleano (true o false) y solo afecta al formato de los valores decimales o numéricos de los resultados capturados. Es decir, la opción FormatDecimals no tiene ningún efecto en otras operaciones como la inserción o la actualización.
De forma predeterminada, FormatDecimals es false. Si se establece en true, se agregarán los ceros iniciales a las cadenas decimales para cualquier valor decimal inferior a 1.
Configuración del número de posiciones decimales
Con FormatDecimals activado, otra opción, DecimalPlaces, permite a los usuarios configurar el número de decimales al mostrar datos de tipo money y smallmoney. Acepta valores enteros en el intervalo de [0, 4] y el redondeo puede producirse al mostrarse. Sin embargo, los datos monetarios subyacentes siguen siendo los mismos.
Ambas opciones se pueden establecer a nivel de conexión o de instrucción, y la configuración de la instrucción siempre prevalece sobre la configuración correspondiente de la conexión. Tenga en cuenta que la opción DecimalPlacessolo afecta a los datos monetarios y que FormatDecimals debe establecerse en verdadero para que DecimalPlaces surta efecto. De lo contrario, el formato se desactiva independientemente del valor DecimalPlaces.
Nota
Puesto que los campos money y smallmoney tienen una escala 4, se omitirá el establecimiento del valor DecimalPlaces en cualquier número negativo o cualquier valor superior a 4. No se recomienda utilizar ningún dato monetario con formato como entrada para ningún cálculo.
Ejemplo: una captura simple
En el siguiente ejemplo se muestra cómo usar las nuevas opciones en una captura simple.
<?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);
?>
Ejemplo: dar formato al parámetro de salida
Si se devuelve un campo decimal o numérico como parámetro de salida, el valor devuelto se considerará como una cadena varchar normal. Sin embargo, si se especifica SQLSRV_SQLTYPE_DECIMAL o SQLSRV_SQLTYPE_NUMERIC, puede establecer FormatDecimals en true para garantizar que no falte ningún cero inicial para el valor de cadena numérico. Para más información, consulte Recuperación de los parámetros de salida con el controlador SQLSRV.
En el siguiente ejemplo se muestra cómo dar formato al parámetro de salida de un procedimiento almacenado que devuelve un valor 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
}