Udostępnij przez


Formatowanie ciągów dziesiętnych i wartości pieniężnych (sterownik PDO_SQLSRV)

Pobieranie sterownika PHP

Aby zachować dokładność, typy dziesiętne lub liczbowe są zawsze pobierane jako ciągi z dokładną dokładnością i skalami. Jeśli jakakolwiek wartość jest mniejsza niż 1, brakuje zera wiodącego. Jest tak samo w przypadku pól money i smallmoney, jak są to pola dziesiętne o stałej skali równej 4.

Dodaj zero wiodące, jeśli brakuje

Począwszy od wersji 5.6.0, atrybut PDO::SQLSRV_ATTR_FORMAT_DECIMALS połączenia lub instrukcji umożliwia użytkownikowi formatowanie łańcuchów dziesiętnych. Ten atrybut oczekuje wartości logicznej (prawda lub fałsz) i wpływa tylko na formatowanie wartości dziesiętnych lub liczbowych w pobranych wynikach. Innymi słowy, ten atrybut nie ma wpływu na inne operacje, takie jak wstawienie lub aktualizacja.

Domyślnie PDO::SQLSRV_ATTR_FORMAT_DECIMALS jest fałszem. Jeśli ustawiono wartość true, wiodące zera do ciągów dziesiętnych zostaną dodane dla dowolnej wartości dziesiętnej mniejszej niż 1.

Konfigurowanie liczby miejsc dziesiętnych

Po włączeniu PDO::SQLSRV_ATTR_FORMAT_DECIMALS inny atrybut połączenia lub instrukcji, PDO::SQLSRV_ATTR_DECIMAL_PLACES, pozwala użytkownikom konfigurować liczbę miejsc dziesiętnych podczas wyświetlania danych typu money i smallmoney. Akceptuje ona wartości całkowite w zakresie [0, 4], a zaokrąglanie może wystąpić po wyświetleniu. Jednak bazowe dane pieniężne pozostają takie same.

Atrybuty instrukcji zawsze zastępują odpowiednie ustawienia połączenia. Należy pamiętać, że PDO::SQLSRV_ATTR_DECIMAL_PLACES opcja dotyczy tylko danych pieniężnych i PDO::SQLSRV_ATTR_FORMAT_DECIMALS musi być ustawiona na wartość true. W przeciwnym razie formatowanie jest wyłączone niezależnie od PDO::SQLSRV_ATTR_DECIMAL_PLACES ustawienia.

Uwaga / Notatka

Ponieważ pola typu money lub smallmoney mają skalę 4, ustawienie PDO::SQLSRV_ATTR_DECIMAL_PLACES na dowolną liczbę ujemną lub wartość większą niż 4 zostanie zignorowane. Nie zaleca się używania żadnych sformatowanych danych pieniężnych jako danych wejściowych do jakichkolwiek obliczeń.

Aby ustawić atrybuty połączenia

  • Ustaw atrybuty w punkcie połączenia:

    $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);
    
  • Ustaw atrybuty po ustanowieniu połączenia.

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

Przykład — formatowanie danych pieniężnych

W poniższym przykładzie pokazano, jak pobrać dane pieniężne przy użyciu 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);
?>

Przykład — zastępowanie atrybutów połączenia

W poniższym przykładzie pokazano, jak zastąpić atrybuty połączenia:

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

Zobacz też

Formatowanie ciągów dziesiętnych i wartości pieniężnych (sterownik SQLSRV)

Pobieranie danych