Formatação de cadeias de caracteres decimais e valores monetários (driver SQLSRV)

Baixar o driver PHP

Para preservar a precisão, tipos decimais ou numéricos são sempre buscados como cadeias de caracteres com precisão e escala exatas. Se qualquer valor for menor que 1, o zero à esquerda estará ausente. É o mesmo com campos money e smallmoney, pois são campos decimais com uma escala fixa igual a 4.

Adicionar zeros à esquerda se estiverem ausentes

Da versão 5.6.0 em diante, a opção FormatDecimals é adicionada aos níveis de conexão e de instrução do sqlsrv, o que permite ao usuário formatar cadeias de caracteres decimais. Essa opção espera um valor booliano (true ou false) e afeta apenas a formatação de valores decimais ou numéricos nos resultados buscados. Em outras palavras, a opção FormatDecimals não tem qualquer efeito sobre outras operações, como inserção ou atualização.

Por padrão, FormatDecimals é false. Se definido como true, os zeros à esquerda das cadeias de caracteres decimais serão adicionados para qualquer valor decimal menor que 1.

Configurar o número de casas decimais

Com FormatDecimals ativado, outra opção, DecimalPlaces, permite que os usuários configurem o número de casas decimais ao exibir dados do tipo money e smallmoney. Ele aceita valores inteiros no intervalo de [0, 4] e o arredondamento pode ocorrer quando mostrado. No entanto, os dados do tipo money subjacentes permanecem os mesmos.

Ambas as opções podem ser definidas como nível de conexão ou de instrução e a configuração de instrução sempre substitui a configuração de conexão correspondente. Observe que a opção DecimalPlaces afeta apenas os dados do tipo money e FormatDecimals deve ser definida como true para que DecimalPlaces entre em vigor. Caso contrário, a formatação será desativada, independentemente da configuração DecimalPlaces.

Observação

Como os campos money ou smallmoney têm escala 4, configurar o valor de DecimalPlaces como um número negativo ou maior que 4 será ignorado. Não é recomendável usar nenhum dado do tipo money formatado como entrada para cálculos.

Exemplo – uma busca simples

O exemplo a seguir mostra como usar as novas opções em uma busca simples.

<?php
$username = 'myusername';
$password = 'mypasword';
$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 retornado como o parâmetro de saída, o valor retornado será considerado uma cadeia de caracteres varchar normal. No entanto, se SQLSRV_SQLTYPE_DECIMAL ou SQLSRV_SQLTYPE_NUMERIC for especificado, você poderá definir FormatDecimals como true para garantir que não falte nenhum zero à esquerda no valor da cadeia de caracteres numérica. Para saber mais, leia Como recuperar parâmetros de saída usando o driver SQLSRV.

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

Consulte Também

Formatação de cadeias de caracteres decimais e valores monetários (driver PDO_SQLSRV)

Recuperando dados