Avatar billede kodak Mester
08. februar 2012 - 20:30 Der er 8 kommentarer og
1 løsning

fjern nuller

jeg har dette eksempel på tal:

450.00000000
900.00000000
-60.00000000
10.00000000
900.65000000
900.00059000

jeg får talne fra databasen
men jeg syntes det er voldsomt med så mange nuller
hvordan fjerner jeg de bagerste nuller
så der kun er 2 decimaler eller til sidste tal der ikke er et nul
så det kommer til at se således ud:

450.00
900.00
-60.00
10.00
900.65
900.00059

hvordan er dette muligt?
Avatar billede Slettet bruger
08. februar 2012 - 21:26 #1
Det lyder som om du henter tallene som tekst-strenge fra databasen i php. Hvis de var floats ville de ikke vise de sidste 0'er når du skrev dem ud.

Hvis det er et krav at der er minimum 2 decimaler og at der skal være flere hvis de sidste decimaler ikke er 0, så er det nemmeste nok at strippe de sidste 0'er.

Hvis du kan leve med at tallene altid har 2 decimaler, kan du f.eks. bruge printf eller number_format:
printf("%01.2f", $x);
echo number_format($x, 2);
Avatar billede inteeeL Nybegynder
08. februar 2012 - 21:36 #2
<?php

function FormatNumber( $number) {
    $result = '';
    if( strpos($number, '.') !== false) {
        $explode_number = explode('.', $number);
        $digits = $explode_number[1];
        $splitDigits = str_split( $digits);
        if( !preg_match('/[1-9]/', $digits)) {
            $new_digits = ( sizeof( $splitDigits) > 2 ? substr( $digits, 0, 2) : $digits);
            $result = $explode_number[0].'.'.$new_digits;
        }
        else {
            $reverseDigits = array_reverse( $splitDigits);
            for( $i = 0; $i < $reverseDigits; $i++) {
                if( $reverseDigits[ $i] == 0) {
                    unset( $reverseDigits[ $i]);
                }
                else {
                    $new_digits = implode('', array_reverse( $reverseDigits));
                    $result = $explode_number[0].'.'.$new_digits;
                    break;
                }
            }
        }
    }
    else {
        $result = $number;
    }
    return $result;
}

echo FormatNumber('450.00000000').'<br>';
echo FormatNumber('900.00000000').'<br>';
echo FormatNumber('-60.00000000').'<br>';
echo FormatNumber('10.00000000').'<br>';
echo FormatNumber('900.65000000').'<br>';
echo FormatNumber('900.00059000');

?>


En lille skræddersyet funktion, der meget gerne skulle løse dit problem. Du bør dog lige sikre, at decimaltallene separeres med et punktum og ikke et komma - ellers kan du erstatte dette i starten af koden med str_replace()..

Koden kan sikkert effektiveres, men det må du selv lige rode lidt med. Jeg er åben for spørgsmål. :-)
Avatar billede kodak Mester
08. februar 2012 - 22:57 #3
inteeeL = der er en fejl i scriptet
hvertfald så snart jeg hverken viser echo enner funktion blanker den min side.
Avatar billede inteeeL Nybegynder
08. februar 2012 - 23:21 #4
Den skulle ikke vise en blank sider, da funktionen uanset hvad returnerer minimum den oprindelige værdi. Det kan være, du tester scriptet forkert.

Bemærk at funktionen skal forekomme, før du kalder den. Funktion først, echo efter.

Det virker fint hos mig. Hvis ikke ovenstående virker, bliver du nød til at uddybe "fejlen", scriptet giver.
Avatar billede kodak Mester
08. februar 2012 - 23:40 #5
det er det også.
Avatar billede kjeldsted Novice
09. februar 2012 - 00:26 #6
Eller også bare:

$var = '123.1230000';
echo (FLOAT)$var;


$var = '900.4000000';
echo floatval($var);


Det er da lidt nemmere...
Avatar billede kjeldsted Novice
09. februar 2012 - 00:27 #7
Ps. #6 er to forskellige måder at gøre det på. Du kan også gøre som #1, og gemme dem som en float, hvis de da kommer fra en DB.
Avatar billede inteeeL Nybegynder
09. februar 2012 - 08:22 #8
Problemet ved blot at bruge float/floatval er, at hvis decimalerne blot er nuller, medtages der ikke to decimaler, som vedkommende (kodak) ellers har i sinde at gøre. Hvis vedkommende dog ikke ønsker at medtage nuller, er dit eksempel (#6) selvfølgelig meget nemmere.

Jeg kunne selvfølgelig også bare have brugt floatval(), hvis tallet indeholdte tal mellem 1-9, da funktionen i det tilfælde er ganske udemærket. Personligt er jeg tilhænger af, at man selv prøver at bikse lidt kode sammen, som løser problemet - hvis ikke en indbygget PHP-funktion kan løse det.

Begge forslag kan bruges..
Avatar billede kodak Mester
09. februar 2012 - 13:08 #9
takker fik to små fejl
havde glemt en end }
og havde fået indsat number_format() på et af talene og det kunne funktionen ikke lide.

takker for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester