Engelse- of franse notatie omzetten naar een decimaal

In de PHP functies number_format en money_format wordt een decimaal omgezet naar een gebruiksvriendelijke weergave:

Decimaal Engelse notatie Franse notatie
1234.56 1.234,56 1,234.56

Hierbij gaan er dus van uit dat de invoer altijd een decimaal is, maar een gebruiker zal nooit een decimaal correct invoeren.

De engelse notatie of franse notatie dient dus voor het opslaan in de database omgezet te worden naar een decimaal.

Bijna alle informatie die je over dit onderwerp kan vinden zal je vertellen een str_replace te gebruiken om de komma's te vervangen door punten.

Hierbij wordt alleen niet rekening gehouden dat een bedrag uit meerdere komma's of punten bestaan, met als gevolg dat de invoer onjuist wordt opgeslagen:

Invoer str_replace number_format_to_decimal
1000,99 1000.99 1000.99
1000.99 1000.99 1000.99
1.000,99 1.000.99 1000.99
1,000.99 1.000.99 1000.99
1.000.000 1.000.000 1000000
1.000.000,99 1.000.000.99 1000000.99
1,000,000 1.000.000 1000000
1,000,000.99 1.000.000.99 1000000.99

Ik kan geen standaard PHP functie vinden die deze invoer kan omzetten naar een decimaal vandaar mijn volgende oplossing:

/*
Converteert een number_format notatie naar een decimale waarde, zodat deze correct in MySQL kan worden opgeslagen.

@param String $value
@return String $decimal
*/
function number_format_to_decimal($value)
{
    define(COMMA, ',');
    define(DOT, '.');

    $count_comma_seperators = 0;
    $count_dot_seperators = 0;

    // Controleren of de komma seperator voorkomt

    if (strpos($value, COMMA) !== FALSE)
    {
        $strpos_seperator_comma = strpos($value, COMMA);
        $count_comma_seperators += substr_count($value , COMMA);
    }

    // Controleren of de punt seperator voorkomt

    if (strpos($value, DOT) !== FALSE)
    {
        $strpos_seperator_dot = strpos($value, DOT);
        $count_dot_seperators += substr_count($value , DOT);
    }

    // Indien er één seperator is, en het is een komma, dan vervangen we de komma door een punt

    if ($count_comma_seperators == 1 && $count_dot_seperators == 0)
    {
        $decimal = str_replace(COMMA, DOT, $value);
    }

    // Indien er één seperator is, en het is een punt, dan doen we niets

    elseif ($count_comma_seperators == 0 && $count_dot_seperators == 1)
    {
        $decimal = $value;
    }

    // Indien er twee verschillende seperators zijn

    elseif ($count_comma_seperators == 1 && $count_dot_seperators == 1)
    {
        $decimal = str_replace(COMMA, DOT, $value);
        $decimal = preg_replace('/[.](?![^.]*$)/', '', $decimal);
    }

    // Indien er meererde punt seperators zijn maar geen komma seperators

    elseif ($count_comma_seperators == 0 && $count_dot_seperators > 1)
    {
        $decimal = str_replace(DOT, '', $value);
    }

    // Indien er meererde komma seperators zijn maar geen punt seperators

    elseif ($count_comma_seperators > 1 && $count_dot_seperators == 0)
    {
        $decimal = str_replace(COMMA, '', $value);
    }

    // Indien er meerdere punt seperators zijn en één komma seperator

    elseif ($count_comma_seperators == 1 && $count_dot_seperators > 1)
    {
        $decimal = str_replace(DOT, '', $value);
        $decimal = str_replace(COMMA, DOT, $decimal);
    }

    // Indien er meerdere komma seperators zijn en één punt seperator

    elseif ($count_comma_seperators > 1 && $count_dot_seperators == 1)
    {
        $decimal = str_replace(COMMA, '', $value);
    }

    else
    {
        $decimal = $value;
    }

    return $decimal;
}

In PHP 5.3 heb je een NumberFormatter class maar ook hier moet je eerst bepalen in welke notatie of datatype de invoer is geschreven, wellicht minder regels code maar nog steeds weinig flexabiliteit.


JavaScript equivalent
/*
Converteert een number_format notatie naar een decimale waarde, zodat er mee gerekend kan worden
@param String value
@return String decimal
*/
function number_format_to_decimal(value)
{   
    var COMMA = ',';
    var DOT   = '.';

    var decimal = '0.00';

    var count_comma_seperators = 0;
    var count_dot_seperators   = 0;

    // Controleren of de komma seperator voorkomt

    if (value.indexOf(COMMA)!= '-1'){
        count_comma_seperators += value.split(COMMA).length - 1;
    }

    // Controleren of de punt seperator voorkomt

    if (value.indexOf(DOT)!= '-1'){
        count_dot_seperators += value.split(DOT).length - 1;
    }

    // Indien er één seperator is, en het is een komma, dan vervangen we de komma door een punt

    if (count_comma_seperators == 1 && count_dot_seperators == 0) {       
        decimal = value.replace(COMMA, DOT);
    }

    // Indien er één seperator is, en het is een punt, dan doen we niets

    else if (count_comma_seperators == 0 && count_dot_seperators == 1) {
        decimal = value;
    }

    // Indien er twee verschillende seperators zijn

    else if (count_comma_seperators == 1 && count_dot_seperators == 1) {
        decimal = value.replace(COMMA, DOT);
        decimal = decimal.replace(/[.](?![^.]*$)/, '');
    }

    // Indien er meererde punt seperators zijn maar geen komma seperators

    else if (count_comma_seperators == 0 && count_dot_seperators > 1) {
        decimal = value.replace(/\./g, '');
    }

    // Indien er meererde komma seperators zijn maar geen punt seperators

    else if (count_comma_seperators > 1 && count_dot_seperators == 0) {
        decimal = value.replace(/\,/g, '');
    }

    // Indien er meerdere punt seperators zijn en één komma seperator

    else if (count_comma_seperators == 1 && count_dot_seperators > 1) {
        decimal = value.replace(/\./g, '');
        decimal = decimal.replace(/\,/g, DOT);
    }

    // Indien er meerdere komma seperators zijn en één punt seperator

    else if (count_comma_seperators > 1 && count_dot_seperators == 1) {
        decimal = value.replace(/\,/g, '');
    }

    else {
        decimal = value;
    }

    return decimal;
}
David van der Tuijn
"Mijn naam is David van der Tuijn, als senior php developer bij Floro Webdevelopment B.V. werk ik samen met een projectleider, back-end developers, front-end developers en designers, op basis van een functioneel- (FO) en technisch ontwerp (TO), bouw ik webapplicaties die voldoen aan de nieuwste ontwikkelingen op internet gebied. Ik werk zelfstandig, weet hoe een architectuur opgezet moet worden en kan deze uitdragen in een multidisciplinair team. binnen een project adviseer ik over de juiste methoden en technieken. Ik ontwikkel en bewaak de kwaliteit van de development werkzaamheden in projecten en kan projecten binnen een afgegeven planning afronden."