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).
Datatype | Længde / Værdi | |
decimal | L,D | L: 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 2 | antal decimaler i feltet i DB |
nej og ja | om der skal vises 'tusind'-separator |
fmaengdeud_2_nej | fmaengdeud_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_nej | fmaengdeud_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
|
|