Partilhar via


Formatando cadeias decimais e valores monetários (driver PDO_SQLSRV)

Descarregar o driver PHP

Para preservar a precisão, tipos decimais ou numéricos são sempre recolhidos como cadeias com precisões e escalas exatas. Se algum valor for menor que 1, falta o zero à esquerda. É o mesmo com os campos do dinheiro e do dinheiro pequeno, pois são campos decimais com uma escala fixa igual a 4.

Adicione zeros à esquerda se estiverem em falta

A partir da versão 5.6.0, o atributo PDO::SQLSRV_ATTR_FORMAT_DECIMALS de ligação ou instrução permite ao utilizador formatar cadeias decimais. Este atributo espera um valor booleano (verdadeiro ou falso) e afeta apenas a formatação dos valores decimais ou numéricos nos resultados obtidos. Ou seja, este atributo não tem efeito noutras operações como inserção ou atualização.

Por defeito, PDO::SQLSRV_ATTR_FORMAT_DECIMALS é falso. Se definido como verdadeiro, os zeros iniciais para cadeias decimais serão somados para qualquer valor decimal inferior a 1.

Configurar o número de casas decimais

Com PDO::SQLSRV_ATTR_FORMAT_DECIMALS ativado, outra ligação ou atributo de instrução, PDO::SQLSRV_ATTR_DECIMAL_PLACES, permite aos utilizadores configurar o número de casas decimais ao apresentar dados dos tipos money e smallmoney. Aceita valores inteiros no intervalo de [0, 4], e pode ocorrer arredondamento quando mostrado. No entanto, os dados monetários subjacentes mantêm-se os mesmos.

Os atributos da instrução sobrepõem-se sempre às definições de ligação correspondentes. Note que a PDO::SQLSRV_ATTR_DECIMAL_PLACES opção afeta apenas os dados monetários e PDO::SQLSRV_ATTR_FORMAT_DECIMALS deve ser definida como verdadeira. Caso contrário, a formatação está desativada independentemente da PDO::SQLSRV_ATTR_DECIMAL_PLACES definição.

Observação

Como os campos dinheiro ou pequeno dinheiro têm uma escala de 4, definir PDO::SQLSRV_ATTR_DECIMAL_PLACES como qualquer número negativo ou qualquer valor maior que 4 será ignorado. Não é recomendado usar quaisquer dados monetários formatados como entradas para qualquer cálculo.

Para definir os atributos de ligação

  • Defina atributos no ponto de ligação:

    $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);
    
  • Definir atributos após a ligação:

    $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);
    

Exemplo - formatar dados monetários

O exemplo seguinte mostra como obter dados de dinheiro usando 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);
?>

Exemplo - sobrescrever atributos de ligação

O exemplo seguinte mostra como sobrescrever os atributos de ligação:

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

$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);
?>

Ver também

Formatação de Cadeias Decimais e Valores de Dinheiro (Driver SQLSRV)

Recuperação de Dados