logo   HTML PHP MySQL decimaltal




Mens vi i Danmark (og mange andre steder) anvender komma som separator i decimaltal, anvender MySQL punktum som separator. Dette indebærer, at der altid skal konverteres både ved inddata (data ind i PHP/MySQL) og ved uddata (data ud af PHP/MySQL).


En anden grund til at modificere uddata kan være ønsket om at indsætte 'tusindseparatorer'.


'Decimal' er den umiddelbart mest hensigtsmæssige datatype i MySQL til mængder (priser, antal og alle andre situationer hvor decimalkomma og / eller tusindseparator vil / kan forekomme som inddata og / eller uddata).

DatatypeLængde / Værdi
decimalL,DL: Det samlede antal cifre feltet skal kunne indeholde.
D: Antallet af decimaler ud af det samlede antal.
L kan højst være 65.


Det er altafgørende, at der er overensstemmelse mellem det antal decimaler, der anvendes i databasefeltet og det antal decimaler, der anvendes i ind- og uddata funktionerne.


Da konverteringerne i begge retninger kan forekomme ofte, er det hensigtsmæssigt, at have de nødvendige koder placeret i funktioner. De kan opbygges og anvendes således:




Filen med funktioner skal være included (og entydig) for at de kan bruges. F.eks:


include ("funktioner/mgdfunk.php");




Inddata


Ved inddata skal der før konverteringen tages højde for, hvordan brugerne indsætter data. Hvad menes f.eks med: 3.5 eller 4.000?


Funktionen til håndtering af inddata (tager imod et dansk tal og returnerer et tal, som PHP og databasen forstår) kan opbygges således (//x: tages ud før brug).


Funktionen behøver kun tilførsel af data fra en variabel benævnt $maengde og afleverer igen data til denne variabel.


Funktionsnavn: fmaengdeind
Funktionen:

function fmaengdeind ($maengde, $antal_decimaler = 2)
{
$maengde = str_replace (".", "x", $maengde);   // Indtastet punktum medfører fejlmeddelelse
$maengde = str_replace (" ", "", $maengde);    // Mellemrum fjernes
$maengde = str_replace (",", ".", $maengde);   // Indtastet decimalkomma erstattes med punktum
if (!is_numeric ($maengde))
    {   return false;   }
else
    {   return $maengde;   }
} //Funktion slut
Funktionen kan passende indlejres i den almindelige validering af data fra en Form:

if ($xxxxx == "")
{
$fejlbeskeder .= "Udfyld feltet<br />";
}
else
{
   $maengde = $xxxxxx;   //f.eks. en pris
   $maengde = fmaengdeind($maengde);
    $xxxxxx = $maengde;
    if (!is_numeric ($xxxxxx))
    {
      $fejlbeskeder .= "Dataene i feltet er ikke gyldige. Kun tal og et enkelt komma er tilladt.<br />";
    }
}




Uddata


Ved uddata fra database til 'echo' eller videre brug vil funktionens forhold variere alt efter situationen (man kan enten have en generel funktion, der tilføres situationsafhængige data (antal decimaler og tusindseparator), eller man kan have en funktion for hver situation. Ved god mnemoteknik vil de sidste nok være nemmest at bruge. (Er anvendt nedenfor).


Funktionerne behøver kun tilførsel af data fra en variabel benævnt $maengde og afleverer igen data til denne variabel.


0 og 2antal decimaler i feltet i DB
nej og jaom der skal vises 'tusind'-separator


fmaengdeud_2_nejfmaengdeud_2_ja
$pris = fmaengdeud_2_nej($row['plan_pris']);$pris = fmaengdeud_2_ja($row['plan_pris']);
Kodeeksempel:

$maengde = $row['variabelnavn'];
$maengde = fmaengdeud_2_nej($maengde);
$variabelnavn = $maengde;
echo "<tr><td>Kr. " . $variabelnavn ."</td></tr>";
Kodeeksempel:

$maengde = $row['variabelnavn'];
$maengde = fmaengdeud_2_ja($maengde);
$variabelnavn = $maengde;
echo "<tr><td>Kr. " . $variabelnavn ."</td></tr>";
Funktion:

function fmaengdeud_2_nej($maengde)
{
$maengde = str_replace (",", "", $maengde);
$maengde = str_replace (" ", "", $maengde);
if (!is_numeric ($maengde))
    {
    return false;
    }
else
    {
    $tusep = "";
    $deci = "2";
    return number_format ($maengde, $deci, ",", $tusep);
    }
} // funktion slut
Funktion:

function fmaengdeud_2_ja($maengde)
{
$maengde = str_replace (",", "", $maengde);
$maengde = str_replace (" ", "", $maengde);
if (!is_numeric ($maengde))
    {
    return false;
    }
else
    {
    $tusep = ".";
    $deci = "2";
    return number_format ($maengde, $deci, ",", $tusep);
    }
} // funktion slut
fmaengdeud_0_nejfmaengdeud_0_ja
$pris = fmaengdeud_0_nej($row['plan_pris']);$pris = fmaengdeud_0_ja($row['plan_pris']);
Kodeeksempel:

$maengde = $row['variabelnavn'];
$maengde = fmaengdeud_0_nej($maengde);
$variabelnavn = $maengde;
echo "<tr><td>Kr. " . $variabelnavn ."</td></tr>";
Kodeeksempel:

$maengde = $row['variabelnavn'];
$maengde = fmaengdeud_0_ja($maengde);
$variabelnavn = $maengde;
echo "<tr><td>Kr. " . $variabelnavn ."</td></tr>";
Funktion:

function fmaengdeud_0_nej($maengde)
{
$maengde = str_replace (",", "", $maengde);
$maengde = str_replace (" ", "", $maengde);
if (!is_numeric ($maengde))
    {
    return false;
    }
else
    {
    $tusep = "";
    $deci = "0";
    return number_format ($maengde, $deci, ",", $tusep);
    }
} // funktion slut
Funktion:

function fmaengdeud_0_ja($maengde)
{
$maengde = str_replace (",", "", $maengde);
$maengde = str_replace (" ", "", $maengde);
if (!is_numeric ($maengde))
    {
    return false;
    }
else
    {
    $tusep = ".";
    $deci = "0";
    return number_format ($maengde, $deci, ",", $tusep);
    }
} // funktion slut
I forbindelse med 'echo' kan de fire funktioner passende indlejres således:

echo "<tr>";
   echo "<td>$row[produkt_navn]</td>";
   $maengde = $row['xxxxx'];
   $maengde = maengdeud_x_x($maengde);
   echo ">td<" . $maengde . " kr.</td>";
echo "</tr>";
I forbindelse med udtræk af default fra DB under UPDATE kan de fire funktioner passende indlejres således:

$maengde = $row['xxxxx'];
$maengde = fmaengdeud_x_x($maengde);




Inddata - grundform


Funktionen til inddata ser sådan ud i sin grundform:


function fmaengde_ind ($maengde, $antal_decimaler = 2) {
$maengde = str_replace (".", "x", $maengde);
$maengde = str_replace (" ", "", $maengde);
$maengde = str_replace (",", ".", $maengde);
if (!is_numeric ($maengde))
    {
    return false;
    }
else
    {
    return $maengde;
    }
} //Funktion slut


Placering


Ved validering


if ($produkt_pris == "")
{
$fejlbeskeder .= "Udfyld pris<br />";
}
else
{
   $belob = $produkt_pris;
   $belob = belob_inddata($belob);
    $produkt_pris_db = $belob;
    if (!is_numeric ($produkt_pris_db))
    {
       $fejlbeskeder .= "Prisen er ikke gyldig. Kun tal og et enkelt komma er tilladte.<br />";
    }
}




Uddata - grundform


Funktionen til inddata ser sådan ud i sin grundform:


Funktionen behøver kun tilførsel af data fra en foranstillet variabel benævnt $beløb og afleverer igen data til denne variabel.


function fmaengde_ud ($maengde, $antal_decimaler = 2, $med_tusindseparator = false)
{
$maengde = str_replace (",", "", $maengde);
$maengde = str_replace (" ", "", $maengde);
if (!is_numeric ($maengde))
    {
    return false;
    }
else
    {
    if ($med_tusindseparator == true)
    {
    $tusindseparator = ".";
    }
    else
    {
    $tusindseparator = "";
    }
    return maengd_ud ($maengde, $antal_decimaler, ",", $tusindseparator);
    }
} // funktion slut


Placering


Ved visning af uddata.


echo "<tr>";
   echo "<td>$row[produkt_navn]</td>";
   $belob = $row['produkt_pris'];
   $belob = belob_uddata ($belob);
   echo ">td<" . $belob . " kr.</td>";
echo "</tr>";


Ved udtræk af default fra DB under UPDATE.


$produkt_navn = $row['produkt_navn'];
$belob = $row['produkt_pris'];
$produkt_pris = belob_uddata($belob); // Konvertér til dansk pris




















x
x