Compartir a través de


Aplicación de formato a cadenas decimales y valores de moneda (controlador SQLSRV)

Descargar controlador PHP

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 activados, otra opción, DecimalPlaces, permite a los usuarios configurar el número de posiciones decimales al mostrar los datos money y smallmoney. Acepta valores enteros en el intervalo de [0, 4] y el redondeo puede producirse al mostrarse. Sin embargo, los datos money subyacentes no cambian.

Ambas opciones se pueden establecer en el nivel de conexión o instrucción, y la configuración de instrucción siempre invalida la configuración de conexión correspondiente. Tenga en cuenta que la opción DecimalPlacessolo afecta a los datos money y FormatDecimals debe establecerse en true para que DecimalPlaces tenga 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 usar los datos money con formato como entradas a cualquier cálculo.

Ejemplo: una captura simple

En el siguiente ejemplo se muestra cómo usar las nuevas opciones en una captura simple.

<?php
$username = 'myusername';
$password = '<password>';
$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);
?>

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
}

Consulte también

Aplicación de formato a cadenas decimales y valores de moneda (controlador PDO_SQLSRV)

Recuperación de datos