[PHP] Float mit nur 1 komma anzeigen + Benchmark

Dieses Thema im Forum "Webentwicklung" wurde erstellt von BladeFire, 2. Oktober 2012 .

  1. 2. Oktober 2012
    Float mit nur 1 komma anzeigen + Benchmark

    Hallo,

    ich würde gerne einen Float mit nur 1 Kommastelle anzeigen lassen. geht das irgendwie? Ich habe zwar schon eine lösung allerdings ist die viel zu aufwendig und ich denke das es einen leichteren weg gibt. Hab nur keinen gefunden^^

    Ps: hab bei google nichts gefunden.

    Danke schonmal


    Mfg Simon
     
  2. 2. Oktober 2012
    Zuletzt bearbeitet: 2. Oktober 2012
    AW: Float mit nur 1 komma anzeigen

    Du kannst mit der "round" Funktion zu einer bestimmten Nachkommastelle runden:
    PHP: round - Manual

    Ansonsten ist der einfachste Weg wohl substr() und ein cast zurück nach float.

    PHP:
    <? php
    $f 
    1.5678 ;
    $s  = (string)  $f ;
    $f  = (float)  substr ( $s 0 strpos ( $s '.' ) +  2 );
     
  3. 2. Oktober 2012
    Zuletzt bearbeitet: 2. Oktober 2012
    AW: Float mit nur 1 komma anzeigen

    Warum nicht number_format ?
    PHP: number_format - Manual

    PHP:
    $f  1234567.89 ;

    $f  number_format $f 1 '.' ''  );  // 1234567.9
     
  4. 2. Oktober 2012
    AW: Float mit nur 1 komma anzeigen

    1234.5678 wird mit number_format(...) zu 1234.6

    Hab das grad in meinem Benchmark entdeckt

    PHP:
    <? php

    function  test_substr () {
      
    $f  1234.5678 ;
      
      for (
    $i  0 $i  100000 ; ++ $i ) {
        
    $s  = (string)  $f ;
        
    $n  substr ( $s 0 strpos ( $s '.' ) +  2 );
      }
      
      return 
    $n ;
    }

    function 
    test_format () {
      
    $f  1234.5678 ;
      
      for (
    $i  0 $i  100000 ; ++ $i )
        
    $n  number_format ( $f 1 '.' '' );
      
      return 
    $n ;
    }

    foreach ([ 
    'test_substr' 'test_format'  ] as  $fn ) {
      
    $av  0 ;
      
      for (
    $i  0 $i  10 ; ++ $i ) {
        
    $st  microtime ( true );
        
    $rs  $fn ();
        
    $av  +=  microtime ( true ) -  $st ;  
      }  
      
      print 
    " $fn $rs  -> "  . ( $av  10 ) .  "\n" ;
    }
    Code:
    test_substr: 1234.5 -> 0.15032012462616
    test_format: 1234.6 -> 0.15226109027863
     
  5. 2. Oktober 2012
    Zuletzt bearbeitet: 2. Oktober 2012
    AW: Float mit nur 1 komma anzeigen

    Würde ich auch einer Lösung mit substr vorziehen. Es ist aber so, dass sowohl number_format wie auch round runden, substr die Zahl abschneidet. Je nachdem, was gewünscht ist, kann man sich also entscheiden

    PHP:
    $f  123.45 ;
    print 
    number_format ( $f 1 ). "\n" ;           // 123.5
    print  round ( $f 1 ). "\n" ;                   // 123.5
    print  substr ( $f 0 strpos ( $f '.' ) +  2 );  // 123.4
    (substr Codeschnippsel von Murdoc)

    /EDIT: Murdoc war schneller und hat mehr Codezeilen
     
  6. 2. Oktober 2012
    Zuletzt bearbeitet: 2. Oktober 2012
    AW: Float mit nur 1 komma anzeigen

    Hier der absolute nonsense Benchmark:

    PHP:
    <? php

    function  test_substr ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i ) {
        
    $s  = (string)  $f ;
        
    $n  substr ( $s 0 strpos ( $s '.' ) +  2 );
      }
      
      return 
    $n ;
    }

    function 
    test_format ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i )
        
    $n  number_format ( $f 1 '.' '' );
      
      return 
    $n ;
    }

    function 
    test_sscanf ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i ) {
        
    sscanf ( $f '%d.%1d' $a $b );
        
    $n  $a  '.'  $b ;
      }
      
      return 
    $n ;
    }

    function 
    test_sprintf ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i )
        
    $n  sprintf ( '%1.1F' $f );
      
      return 
    $n ;
    }

    function 
    test_explode ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i ) {
        
    $n  explode ( '.' $f );
        
    $n  $n [ 0 ] .  '.'  $n [ 1 ][ 0 ];
      }
      
      return 
    $n ;
    }

    function 
    test_strrchr ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i )
        
    $n  = (int)  $f  '.'  strrchr ( $f '.' )[ 1 ];
      
      return 
    $n ;
    }

    function 
    test_strtok ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i ) {
        
    $n  strtok ( $f '.' );
        
    $n  .=  '.'  strtok ( '.' )[ 0 ];
      }
      
      return 
    $n ;
    }

    function 
    test_int_substr ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i )
        
    $n  substr ( $f 0 strlen ((int)  $f ) +  2 );
      
      return 
    $n ;
    }

    function 
    test_preg_match ( $f ) {  
      for (
    $i  0 $i  100000 ; ++ $i ) {
        
    preg_match ( '/\d+\.\d{1}/' $f $n );
        
    $n  $n [ 0 ];
      }
      
      return 
    $n ;
    }

    function 
    test_preg_replace1 ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i )
        
    $n  preg_replace ( '/^(\d+\.\d)\d+/' '$1' $f );
      
      return 
    $n ;
    }

    function 
    test_preg_replace2 ( $f ) {
      for (
    $i  0 $i  100000 ; ++ $i )
        
    $n  preg_replace ( '/(?<=\.\d)\d+/' '' $f );
      
      return 
    $n ;
    }

    $tests  = [ 
      
    'test_substr' 'test_format' 'test_sscanf' 'test_sprintf'
      
    'test_explode' 'test_strrchr' 'test_strtok' 'test_int_substr' ,
      
    'test_preg_match' 'test_preg_replace1' 'test_preg_replace2'
    ];

    $cases  = [  'float'  =>   1234.5678 'string'  =>  '1234.5678'  ];

    print 
    "## RR Float-Format Benchmark ##\n" ;

    foreach (
    $cases  as  $t  =>  $f ) {
      print 
    "\n $t :\n\n" ;
      
      foreach (
    $tests  as  $fn ) {
        
    $av  0 ;
        
        for (
    $i  0 $i  10 ; ++ $i ) {
          
    $st  microtime ( true );
          
    $rs  $fn ( $f );
          
    $av  +=  microtime ( true ) -  $st ;  
        }  
        
        
    printf ( "%'.-25s: %s -> %f (%s)\n" $fn $rs $av  10
          
    $rs  ===  '1234.5'  'okay'  'fail' );
      }
      
      print 
    "\n" ;
    }
    Code:
    ## RR Float-Format Benchmark ##
    
    float:
    
    test_substr..............: 1234.5 -> 0.151413 (okay)
    test_format..............: 1234.6 -> 0.151977 (fail)
    test_sscanf..............: 1234.5 -> 0.258539 (okay)
    test_sprintf.............: 1234.6 -> 0.123432 (fail)
    test_explode.............: 1234.5 -> 0.176371 (okay)
    test_strrchr.............: 1234.5 -> 0.157605 (okay)
    test_strtok..............: 1234.5 -> 0.172209 (okay)
    test_cast_substr.........: 1234.5 -> 0.161644 (okay)
    test_preg_match..........: 1234.5 -> 0.247684 (okay)
    test_preg_replace1.......: 1234.5 -> 0.233366 (okay)
    test_preg_replace2.......: 1234.5 -> 0.267211 (okay)
    
    
    string:
    
    test_substr..............: 1234.5 -> 0.080791 (okay)
    test_format..............: 1234.6 -> 0.162589 (fail)
    test_sscanf..............: 1234.5 -> 0.179441 (okay)
    test_sprintf.............: 1234.6 -> 0.136203 (fail)
    test_explode.............: 1234.5 -> 0.097808 (okay)
    test_strrchr.............: 1234.5 -> 0.091450 (okay)
    test_strtok..............: 1234.5 -> 0.098151 (okay)
    test_cast_substr.........: 1234.5 -> 0.095918 (okay)
    test_preg_match..........: 1234.5 -> 0.170485 (okay)
    test_preg_replace1.......: 1234.5 -> 0.164354 (okay)
    test_preg_replace2.......: 1234.5 -> 0.196623 (okay)
    Zum Vergleich in JS:
    Code:
    n = s.substr(0, s.indexOf('.') + 2);
    Code:
    Number...................: 1234.5 -> 0.174699 (okay) [Mit cast zu String]
    String...................: 1234.5 -> 0.014599 (okay)
    Number#toFixed().........: 1234.6 -> 0.034999 (fail)
     
    1 Person gefällt das.
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.