Formattazione di stringhe decimali e valori money (driver SQLSRV)
Per mantenere l'accuratezza, i tipi decimali o numerici vengono sempre recuperati come stringhe con precisioni e scale esatte. Se un valore è minore di 1, lo zero iniziale è mancante. Lo stesso vale per i campi money e smallmoney, poiché sono campi decimali con una scala fissa uguale a 4.
Aggiungere zeri iniziali se mancanti
A partire dalla versione 5.6.0, l'opzione FormatDecimals
viene aggiunta ai livelli di connessione e istruzione sqlsrv per consentire all'utente di formattare le stringhe decimali. Questa opzione prevede un valore booleano (true o false) e riguarda solo la formattazione dei valori decimali o numerici nei risultati recuperati. In altri termini, l'opzione FormatDecimals
non ha effetto su altre operazioni come l'inserimento o l'aggiornamento.
L'impostazione predefinita di FormatDecimals
è false. Se è impostato su true, verranno aggiunti gli zeri iniziali alle stringhe decimali per qualsiasi valore decimale minore di 1.
Configurare il numero di posizioni decimali
Con l'opzione FormatDecimals
attivata, un'altra opzione, DecimalPlaces
, consente agli utenti di configurare il numero di posizioni decimali durante la visualizzazione dei dati money e smallmoney. Accetta i valori interi nell'intervallo [0, 4] e può essere arrotondata quando indicato. I dati di tipo money sottostanti rimangono tuttavia invariati.
Entrambe le opzioni possono essere impostate sul livello di connessione o di istruzione e l'impostazione dell'istruzione esegue sempre l'override dell'impostazione della connessione corrispondente. Si noti che l'opzione DecimalPlaces
riguarda solo i dati di tipo money ed è necessario impostare FormatDecimals
su true affinché DecimalPlaces
abbia effetto. In caso contrario, la formattazione viene disattivata indipendentemente dall'impostazione di DecimalPlaces
.
Nota
Poiché i campi money o smallmoney hanno scala 4, se si imposta il valore di DecimalPlaces
su un numero negativo o su un valore maggiore di 4 tale impostazione verrà ignorata. Non è consigliabile usare i dati di tipo money formattati come input per qualsiasi calcolo.
Esempio: recupero semplice
Nell'esempio seguente viene illustrato come usare le nuove opzioni in un recupero semplice.
<?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);
?>
Esempio: formattare il parametro di output
Se un campo decimale o numerico viene restituito come parametro di output, il valore restituito verrà considerato come una normale stringa varchar. Se tuttavia si specifica sia SQLSRV_SQLTYPE_DECIMAL sia SQLSRV_SQLTYPE_NUMERIC, è possibile impostare FormatDecimals
su true per assicurarsi che non vi siano zeri iniziali mancanti per il valore della stringa numerica. Per altre informazioni, vedere Procedura: Recuperare i parametri di output mediante il driver SQLSRV.
Nell'esempio seguente viene illustrato come formattare il parametro di output di una stored procedure che restituisce un valore decimale (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
}
Vedi anche
Formattazione di stringhe decimali e valori money (driver PDO_SQLSRV)