#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 + Multi-Zitat Zitieren
#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 ); + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#4 2. Oktober 2012 AW: Float mit nur 1 komma anzeigen Herzlichsten Dank. -Simon + Multi-Zitat Zitieren
#5 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 + Multi-Zitat Zitieren
#6 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 + Multi-Zitat Zitieren
#7 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. + Multi-Zitat Zitieren