webentwicklung-frage-antwort-db.com.de

Wie entferne ich nachfolgende Nullen? PHP

Hallo, könnte mir jemand eine Erklärung geben (und vielleicht ein Beispiel), wie ich mit PHP die nachgestellten Nullen von einer Zahl entfernen könnte.

Zum Beispiel: 

"Lat":"37.422005000000000000000000000000","Lon":"-122.84095000000000000000000000000"

Würde sich wenden an:

"Lat":"37.422005","Lon":"-122.84095"

Ich versuche, die Nullen zu entfernen, um sie lesbarer zu machen. Ich habe versucht, str_replace() zu verwenden, aber dies ersetzt auch die Nullen in der Zahl (doh).

Danke = D

60
nhunston

Vergessen Sie alle Zeichenfolgen und regulären Ausdrücke. Die Koordinaten sind Gleitkommazahlen und sollten als Gleitkommazahlen behandelt werden. Stellen Sie der Variablen einfach (float) voran, um sie von einer Zeichenfolge in eine Gleitkommazahl umzuwandeln:

$string = "37.422005000000000000000000000000";
echo (float)$string;

ausgabe:

37.422005

Das tatsächliche Ergebnis, das Sie haben, sind Gleitkommazahlen, die jedoch aufgrund des HTTP-Protokolls als Zeichenfolgen übergeben werden. Es ist empfehlenswert, sie wieder in ihre natürliche Form umzuwandeln, um Berechnungen durchzuführen.

Testfall: http://codepad.org/TVb2Xyy3

Note: Zum Kommentar zur Gleitkomma-Genauigkeit in PHP siehe: https://stackoverflow.com/a/3726761/353790

111
RobertPitt

Versuchen Sie es mit rtrim :

$number = rtrim($number, "0");

Wenn Sie eine Dezimalzahl haben, die auf 0 endet (z. B. 123.000), möchten Sie moglicherweise das Dezimaltrennzeichen entfernen, das je nach verwendetem Gebietsschema unterschiedlich sein kann. Um es zuverlässig zu entfernen, können Sie Folgendes tun:

$number = rtrim($number, "0");
$locale_info = localeconv();
$number = rtrim($number, $locale_info['decimal_point']);

Dies ist natürlich keine kugelsichere Lösung und ist möglicherweise nicht die beste. Wenn Sie eine Zahl wie 12300.00 haben, werden die nachgestellten 0 nicht aus dem Ganzzahl-Teil entfernt, Sie können sie jedoch an Ihre speziellen Bedürfnisse anpassen.

25
jweyrich

Wenn Sie das Trimmen oder andere Saitenmanipulationen versuchen, stoßen Sie auf viele Probleme. Versuchen Sie es auf diese Weise.

$string = "37.422005000000000000000000000000";

echo $string + 0;

Ausgänge:

37.422005
20
Okonomiyaki3000

Sie können auch floatval(val); verwenden.

 <?php
 echo floatval( "37.422005000000000000000000000000" );
 ?>

führt in 

37.422005

7
Farray

In meinem Fall habe ich Folgendes getan und hier andere Antworten gegeben:

rtrim((strpos($number,".") !== false ? rtrim($number, "0") : $number),".");

Weil ich auch das Dezimalzeichen entfernen musste, wenn eine ganze Zahl angezeigt wurde 

Als Beispiel werden hier die folgenden Nummern angezeigt 

2.00, 1.00, 28.50, 16.25 

Wie

2, 1, 28.5, 16.25

Eher, als 

2., 1., 28.5, 16.25

Was für mich nicht richtig angezeigt wird.

Die letzte Bearbeitung verhindert auch, dass Zahlen wie "100" auf 1 gesetzt werden, indem nur die ganz rechten Nullen beschnitten werden, wenn eine Dezimalstelle gefunden wird.

4
Warren Sergent

Wenn Sie die überzähligen Nullen vom Ende weg, aber nur bis zu einer bestimmten Dezimalstelle entfernen möchten, ist dies ein nützlicher Ausdruck, um genau das zu tun (z. B. zeigt 0,30000 0,30 und 0,0003000 0,0003).

preg_replace("/(?<=\\.[0-9]{2})[0]+\$/","",$number);

Natürlich steuert die {2} das Dezimalstellenlimit.

4
scott klarr

Bei den meisten dieser Lösungen werden signifikante Stellen in Zahlen wie "100" (keine nachkommende Dezimalzahl) abgeschnitten. Hier ist eine einfache Lösung, die dieses Problem nicht hat:

function TrimTrailingZeroes($nbr) {
    if(strpos($nbr,'.')!==false) $nbr = rtrim($nbr,'0');
    return rtrim($nbr,'.') ?: '0';
}

Ich denke, das deckt alle verschiedenen Szenarien ab.

>>> TrimTrailingZeroes('0')
=> "0"
>>> TrimTrailingZeroes('01')
=> "01"
>>> TrimTrailingZeroes('01.0')
=> "01"
>>> TrimTrailingZeroes('01.01')
=> "01.01"
>>> TrimTrailingZeroes('01.010')
=> "01.01"
>>> TrimTrailingZeroes('.0')
=> "0"
>>> TrimTrailingZeroes('.1')
=> ".1"
>>> TrimTrailingZeroes('.10')
=> ".1"
>>> TrimTrailingZeroes('3141592653589793.238462643383279502880000000000000000000000000000')
=> "3141592653589793.23846264338327950288"
4
mpen

Trimmt nachgestellte Nullen ab, aber nur nach der Dezimalstelle - wir möchten zum Beispiel nicht 100 -> 1 konvertieren. Die Periode wird auch entfernt, wenn nur Nullen folgen.

function trim_zeros($str) {
    if(!is_string($str)) return $str;
    return preg_replace(array('`\.0+$`','`(\.\d+?)0+$`'),array('','$1'),$str);
}
3
mpen

Für mich brauche ich eine weitere Lösung, um exponentielle Werte und einfache Zahlen wie 10000 in die letzte nicht nullwertige Ziffer zu konvertieren 

/* Convert any value to the least significant value */
function toDecimal($val) {

  // Convert any exponential sign to proper decimals
  $val = sprintf("%lf", $val);

  if (strpos($val, '.') !== false) {
      $val = rtrim(rtrim($val, '0'), '.');
  }

  return $val;
}

// Test cases
echo toDecimal(1000.000) . "\n";
echo toDecimal(1E-5) . "\n";
echo toDecimal(1E+5) . "\n";
echo toDecimal(1234.56) . "\n";
echo toDecimal(1234.5700) . "\n";
echo toDecimal(1234000) . "\n";
echo toDecimal(-1e10) . "\n";

// Results
1000
0.00001
100000
1234.56
1234.57
1234000
-10000000000
1
Joe Kuan

Sie sollten die round-Funktion verwenden die Zahlen besser manipulieren kann als eine replace.

1
William Durand

Wenn Sie eine Lösung wünschen, die eine minimale und maximale Anzahl von Dezimalstellen akzeptiert, sollte dies funktionieren:

/**
 * Displays up to 4 decimal places, with a minimum of 2 decimal places, trimming unnecessary zeroes
 *
 * @param mixed $number
 * @param int $minimumDecimals
 * @param int $maximumDecimals
 * @return string
 */
function rate_format($number, int $minimumDecimals = 2, int $maximumDecimals = 4): string
{
    $formatted = number_format($number, $maximumDecimals, '.', ',');
    $minimumLength = strpos($formatted, '.') + $minimumDecimals + 1;
    $extra = rtrim(substr($formatted, $minimumLength), "0");
    return substr($formatted, 0, $minimumLength) . $extra;
}


// rate_format("1.2500") returns "1.25"
// rate_format("1.2525") returns "1.2525"
// rate_format("1.25256") returns "1.2526"
// rate_format("1") returns "1.00"

Dies ist für die Verwendung des US-Gebietsschemas hartcodiert, sollte jedoch leicht für andere Gebietsschemas angepasst werden.

0
Devon

hmm, interessant. Ich habe das benutzt: 

// remove leading zeros
$output = ltrim ($output, "0");

// remove trailing 0s.
$temp=explode(".",$output);
$temp[1]=rtrim($temp[1],"0");
$output = $temp[0];
if (!empty($temp[1])) $output.='.'.$temp[1];

return $output;

Dadurch werden hinter der ersten Dezimalstelle nachfolgende Nullen aus der Zahl entfernt. Andernfalls wird eine Zahl wie 100 zu 1.

Da ich einen Vergleich machte, bereitete die Verwendung der Float-Technik Probleme. Hoffe das hilft?

0
Dan

Sie können rtrim () ( http://www.php.net/manual/de/function.rtrim.php ) verwenden:

rtrim( "37.422005000000000000000000000000" , "0" )

Stellen Sie nur sicher, dass es einen Dezimalpunkt gibt.

0
linepogl