with solo round redondear places mostrar hacia floatval float decimals decimales arriba php decimal

solo - string to decimal php



PHP: obtener el número de dígitos decimales (16)

Solución

$num = "12.1234567"; print strlen(preg_replace("/.*/./", "", $num)); // 7

Explicación

Patrón " . * / " "Significa todos los caracteres antes del punto decimal con su.

En este caso, es una cadena con tres caracteres: " 12. ".

La función preg_replace convierte estos caracteres en una cadena vacía (segundo parámetro).

En este caso obtenemos esta cadena: " 1234567 ".

La función strlen cuenta el número de caracteres en la cadena anterior.

¿Existe alguna manera directa de determinar el número de decimales en un (entero) valor entero / doble en PHP? (es decir, sin usar explode )


En t

Los enteros no tienen dígitos decimales, por lo que la respuesta siempre es cero.

Doble / flotador

Los números dobles o float son aproximaciones. Entonces no tienen un conteo definido de dígitos decimales.

Un pequeño ejemplo:

$number = 12.00000000012; $frac = $number - (int)$number; var_dump($number); var_dump($frac);

Salida:

float(12.00000000012) float(1.2000000992884E-10)

Aquí puede ver dos problemas, el segundo número usa la representación científica y no es exactamente 1.2E-10.

Cuerda

Para una cadena que contiene un entero / flotante, puede buscar el punto decimal:

$string = ''12.00000000012''; $delimiterPosition = strrpos($string, ''.''); var_dump( $delimiterPosition === FALSE ? 0 : strlen($string) - 1 - $delimiterPosition );

Salida:

int(11)


¿Qué tal esto?:

$iDecimals = strlen($sFull%1);


Algo como:

<?php $floatNum = "120.340304"; $length = strlen($floatNum); $pos = strpos($floatNum, "."); // zero-based counting. $num_of_dec_places = ($length - $pos) - 1; // -1 to compensate for the zero-based count in strpos() ?>

Esto es de procedimiento, kludgy y no aconsejaría usarlo en el código de producción. Pero debería ayudarte a comenzar.


Aquí hay una función que tiene en cuenta los ceros finales:

function get_precision($value) { if (!is_numeric($value)) { return false; } $decimal = $value - floor($value); //get the decimal portion of the number if ($decimal == 0) { return 0; } //if it''s a whole number $precision = strlen($decimal) - 2; //-2 to account for "0." return $precision; }


Necesitaba una solución que funcionara con varios formatos de números y obtuve los siguientes algoritmos:

// Count the number of decimal places $current = $value - floor($value); for ($decimals = 0; ceil($current); $decimals++) { $current = ($value * pow(10, $decimals + 1)) - floor($value * pow(10, $decimals + 1)); } // Count the total number of digits (includes decimal places) $current = floor($value); for ($digits = $decimals; $current; $digits++) { $current = floor($current / 10); }

Resultados:

input: 1 decimals: 0 digits: 1 input: 100 decimals: 0 digits: 3 input: 0.04 decimals: 2 digits: 2 input: 10.004 decimals: 3 digits: 5 input: 10.0000001 decimals: 7 digits: 9 input: 1.2000000992884E-10 decimals: 24 digits: 24 input: 1.2000000992884e6 decimals: 7 digits: 14


Podrías tratar de convertirlo a un int, restando eso de tu número y luego contar lo que queda.


Primero he encontrado la ubicación del decimal usando la función strpos e incremento el valor de la posición strpos en 1 para saltear el lugar decimal.

En segundo lugar, restamos la longitud total de la cadena del valor que obtuve del punto1.

Tercero, he usado la función substr para obtener todos los dígitos después del decimal.

Cuarto, he usado la función strlen para obtener la longitud de la cadena después del lugar decimal.

Este es el código que realiza los pasos descritos anteriormente:

<?php $str="98.6754332"; echo $str; echo "<br/>"; echo substr( $str, -(strlen($str)-(strpos($str, ''.'')+1)) ); echo "<br/>"; echo strlen( substr( $str, -(strlen($str)-(strpos($str, ''.'')+1))) ); ?>


Siempre debes tener cuidado con diferentes lugares. Las configuraciones regionales europeas usan una coma para el separador de miles, por lo que la respuesta aceptada no funcionaría. Vea a continuación una solución revisada:

function countDecimalsUsingStrchr($stringValue){ $locale_info = localeconv(); return strlen(substr(strrchr($stringValue, $locale_info[''decimal_point'']), 1)); }

ver localeconv


Usé lo siguiente para determinar si un valor devuelto tiene decimales (valores decimales reales, no solo formateados para mostrar decimales como 100.00):

if($mynum - floor($mynum)>0) {has decimals;} else {no decimals;}


Si desea legibilidad para el beneficio de otros desarrolladores, localidad segura, use:

function countDecimalPlacesUsingStrrpos($stringValue){ $locale_info = localeconv(); $pos = strrpos($stringValue, $locale_info[''decimal_point'']); if($pos){ return strlen($stringValue) - ($pos + 1); } return 0; }

ver localeconv


$decnumber = strlen(strstr($yourstr,''.''))-1


$str = "1.23444"; print strlen(substr(strrchr($str, "."), 1));


$value = 182.949; $count = strlen(abs($value - floor($value))) -2; //0.949 minus 2 places (0.)


<?php test(0); test(1); test(1.234567890); test(-123.14); test(1234567890); test(12345.67890); function test($f) { echo "f = $f/n"; echo "i = ".getIntCount($f)."/n"; echo "d = ".getDecCount($f)."/n"; echo "/n"; } function getIntCount($f) { if ($f === 0) { return 1; } elseif ($f < 0) { return getIntCount(-$f); } else { return floor(log10(floor($f))) + 1; } } function getDecCount($f) { $num = 0; while (true) { if ((string)$f === (string)round($f)) { break; } if (is_infinite($f)) { break; } $f *= 10; $num++; } return $num; }

Productos:

f = 0 i = 1 d = 0 f = 1 i = 1 d = 0 f = 1.23456789 i = 1 d = 8 f = -123.14 i = 3 d = 2 f = 1234567890 i = 10 d = 0 f = 12345.6789 i = 5 d = 4


function numberOfDecimals($value) { if ((int)$value == $value) { return 0; } else if (! is_numeric($value)) { // throw new Exception(''numberOfDecimals: '' . $value . '' is not a number!''); return false; } return strlen($value) - strrpos($value, ''.'') - 1; } /* test and proof */ function test($value) { printf("Testing [%s] : %d decimals/n", $value, numberOfDecimals($value)); } foreach(array(1, 1.1, 1.22, 123.456, 0, 1.0, ''1.0'', ''not a number'') as $value) { test($value); }

Productos:

Testing [1] : 0 decimals Testing [1.1] : 1 decimals Testing [1.22] : 2 decimals Testing [123.456] : 3 decimals Testing [0] : 0 decimals Testing [1] : 0 decimals Testing [1.0] : 0 decimals Testing [not a number] : 0 decimals