Partilhar via


Formatando cadeias de caracteres decimais e valores monetários (driver 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, a opção FormatDecimals é adicionada aos níveis de ligação e instrução sqlsrv, permitindo ao utilizador formatar cadeias decimais. Esta opção espera um valor booleano (verdadeiro ou falso) e só afeta a formatação dos valores decimais ou numéricos nos resultados buscados. Ou seja, a FormatDecimals opção não tem efeito noutras operações como inserção ou atualização.

Por defeito, FormatDecimals é 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 FormatDecimals ativado, outra opção, DecimalPlaces, permite aos utilizadores configurar o número de casas decimais ao mostrar dados de dinheiro e de pequena moeda. 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.

Ambas as opções podem ser definidas ao nível de ligação ou de instrução, e a definição de instrução sobrepõe-se sempre à configuração de ligação correspondente. Note que a DecimalPlaces opção afeta apenas os dados monetários, e FormatDecimals deve ser definido para verdade para que DecimalPlaces entre em vigor. Caso contrário, a formatação está desativada independentemente da DecimalPlaces definição.

Observação

Como os campos de dinheiro ou smallmoney têm uma escala de precisão de 4, definir o valor de DecimalPlaces para qualquer número negativo ou qualquer valor superior a 4 será ignorado. Não é recomendado usar quaisquer dados monetários formatados como entradas para qualquer cálculo.

Exemplo - um simples fetch

O exemplo seguinte mostra como usar as novas opções numa busca simples.

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

Exemplo - formatar o parâmetro de saída

Se um campo decimal ou numérico for devolvido como parâmetro de saída, o valor devolvido será considerado uma cadeia varchar regular. No entanto, se for especificado SQLSRV_SQLTYPE_DECIMAL ou SQLSRV_SQLTYPE_NUMERIC, pode definir FormatDecimals como true para garantir que não falta zero à esquerda para o valor numérico da cadeia. Para mais informações, por favor leia Como: Recuperar Parâmetros de Saída Usando o Driver SQLSRV.

O exemplo seguinte mostra como formatar o parâmetro de saída de um procedimento armazenado que devolve um 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
}

Ver também

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

Recuperação de Dados