Share via


Aplicación de formato a cadenas decimales y valores de moneda (controlador PDO_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, el atributo de instrucción o conexión PDO::SQLSRV_ATTR_FORMAT_DECIMALS permite al usuario aplicar formato a las cadenas decimales. Este atributo 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, este atributo no tiene ningún efecto en otras operaciones como la inserción o la actualización.

De forma predeterminada, PDO::SQLSRV_ATTR_FORMAT_DECIMALS 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 PDO::SQLSRV_ATTR_FORMAT_DECIMALS activados, otro atributo de instrucción o conexión, PDO::SQLSRV_ATTR_DECIMAL_PLACES, 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.

Los atributos de instrucción siempre invalidan la configuración de conexión correspondiente. Tenga en cuenta que la opción PDO::SQLSRV_ATTR_DECIMAL_PLACESsolo afecta a los datos money y PDO::SQLSRV_ATTR_FORMAT_DECIMALS debe establecerse en true. De lo contrario, el formato se desactiva independientemente del valor PDO::SQLSRV_ATTR_DECIMAL_PLACES.

Nota:

Puesto que los campos money y smallmoney tienen una escala 4, se omitirá el establecimiento de PDO::SQLSRV_ATTR_DECIMAL_PLACES 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.

Para establecer los atributos de conexión

  • Establezca atributos en el punto de conexión:

    $attrs = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => true,
                   PDO::SQLSRV_ATTR_DECIMAL_PLACES => 2);
    
    $conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password, $attrs);
    
  • Establezca atributos después de la conexión:

    $conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password);
    $conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
    $conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);
    

Ejemplo: dar formato a datos money

En el siguiente ejemplo se muestra cómo capturar los datos money mediante PDOStatement::bindColumn:

<?php
$database = "myDB";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server; Database = $database", "", "");
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);

$numDigits = 3;
$query = "SELECT smallmoney1 FROM aTable";
$options = array(PDO::SQLSRV_ATTR_DECIMAL_PLACES => $numDigits);
$stmt = $conn->prepare($query, $options);
$stmt->execute();

$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);
echo $field;    // expect a number string with 3 decimal places

unset($stmt);
unset($conn);
?>

Ejemplo: invalidar atributos de conexión

En el siguiente ejemplo se muestra cómo invalidar los atributos de conexión:

<?php
$database = 'myDatabase';
$server = 'myServer';
$username = 'myuser';
$password = 'mypassword'

$conn = new PDO("sqlsrv:server=$server; Database = $database", $username, $password);
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
$conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);

$query = 'SELECT smallmoney1 FROM testTable1';
$options = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => false);
$stmt = $conn->prepare($query, $options);
$stmt->execute();

$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);  
echo $field;   // expect a number string showing the original scale -- 4 decimal places

unset($stmt);
unset($conn);
?>

Consulte también

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

Recuperación de datos