Sabi: Vor dem Komma alles streichen

In meiner Variable steht

$wert = 0.34;

ich möchte gerne, alles was vor dem Komma ist streichen. Ich habe zwar alles gefunden zum runden und kürzen nach dem Komma, aber nichts für Vor dem Komma!

Gibt es da so etwas nicht?

Sabi

  1. Hallo Sabi,

    $wert = 0.34;

    ich möchte gerne, alles was vor dem Komma ist streichen. Ich habe zwar alles gefunden zum runden und kürzen nach dem Komma, aber nichts für Vor dem Komma!

    Gibt es da so etwas nicht?

    Brauchst du die Zahl ‚34‘?

    Matthias

    --
    Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
    1. @@Matthias Apsel

      Brauchst du die Zahl ‚34‘?

      0.34 ergibt 34, aber 0.3 ergibt 3?

      Macht nicht wirklich Sinn, oder?

      LLAP 🖖

      --
      „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
      „Hat auf dem Forum herumgelungert …“
      (Wachen in Asterix 36: Der Papyrus des Cäsar)
      1. Moin!

        @@Matthias Apsel

        Brauchst du die Zahl ‚34‘?

        0.34 ergibt 34, aber 0.3 ergibt 3?

        Das denke ich, war nicht gemeint:

        Ausgangswerte:

        0.34 / 0.3 / 1.3

        Ziel: "Alles vor dem Komma alles streichen":

        .34 / .3 / 1.3

        Ich denke nämlich und Hilfe der Kristallkugel, "Sabi" meint tatsächlich die führenden Nullen und ergänze das mal durch "auch nachfolgende Nullen":

        <?php
        $n=0.34;
        $s=preg_replace('/0+$/','', preg_replace ('/^0/', '', sprintf('%f', $n)));
        echo $s, "\n";
        

        Von innen nach außen:

        1. sprintf('%f', 0.34) macht aus der Zahl 0.34 den String '0.34000'.
        2. preg_replace ('/^0/', '', '0.34000') entfernt die führende Null: '.34000'
        3. preg_replace ('/0+$/', '', '.34000') entfernt die hinten anhängenden Nullen: '.34'

        Anders (besser, schlanker) formuliert:

        <?php
        $n=0.34;
        $ar[]='/0+$/'; # Nullen hinten
        $ar[]='/^0/';  # eine Null vorn
        $s=preg_replace($ar, '', sprintf('%f', $n));
        echo $s, "\n";
        

        als Funktion:

        <?php
        function numToShortString($n) {
          return preg_replace(array ('/0+$/', '/^0/'), '', sprintf('%f', $n));
        }
        
        echo numToShortString(0.34), "\n";
        echo numToShortString(0.3), "\n";
        echo numToShortString(1.3), "\n";
        

        Ergebnisse:

        .34
        .3
        1.3
        

        Jörg Reinholz

        1. Moin!

          <?php
          function numToShortString($n) {
            return preg_replace(array ('/0+$/', '/^0/'), '', sprintf('%f', $n));
          }
          
          echo numToShortString(0.34), "\n";
          echo numToShortString(0.3), "\n";
          echo numToShortString(1.3), "\n";
          

          Da fällt mir ein, dass negative Werte eventuell berücksichtigt werden müssen:

          <?php
          function numToShortString($n, $german=false) {
            $vorzeichen = ($n < 0 ) ? '-' : '';
            $n=abs($n);
            if (! $german) {
              return $vorzeichen . preg_replace(array ('/0+$/', '/^0/'), '', sprintf('%f', $n));
            } else  {
              return $vorzeichen . str_replace('.', ',' , preg_replace(array ('/0+$/', '/^0/'), '', sprintf('%f', $n)));
            }
          }
          
          ## Tests
          /* 
          echo numToShortString(0.34), "\n";
          echo numToShortString(0.3), "\n";
          echo numToShortString(1.3), "\n";
          echo numToShortString(-0.34), "\n";
          echo numToShortString(-0.3), "\n";
          echo numToShortString(-1.3), "\n";
          echo "\n";
          echo numToShortString(0.34, true), "\n";
          echo numToShortString(0.3, true), "\n";
          echo numToShortString(1.3, true), "\n";
          echo numToShortString(-0.34, true), "\n";
          echo numToShortString(-0.3, true), "\n";
          echo numToShortString(-1.3, true), "\n";
          # */
          

          Will man noch mehr, dann sollte sich auch number_format() ansehen

          Jörg Reinholz

  2. @@Sabi

    $wert = 0.34;

    ich möchte gerne, alles was vor dem Komma ist streichen.

    Du willst den Nachkomma-Anteil?

    In dem Fall also 0.34? Und für 12.34 soll auch 0.34 rauskommen?

    Gibt es da so etwas nicht?

    In PHP gibt’s dafür AFAIS keine eigene Funktion. Du kannst aber von deinem Wert den ganzzahligen Anteil abziehen.

    Für negative Zahlen müsste man eine Fallunterscheidung machen, wenn das erforderlich sein sollte.

    LLAP 🖖

    --
    „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
    „Hat auf dem Forum herumgelungert …“
    (Wachen in Asterix 36: Der Papyrus des Cäsar)
    1. Hallo Gunnar,

      Gibt es da so etwas nicht?

      In PHP gibt’s dafür AFAIS keine eigene Funktion. Du kannst aber von deinem Wert den ganzzahligen Anteil abziehen.

      Für negative Zahlen müsste man eine Fallunterscheidung machen, wenn das erforderlich sein sollte.

      Deshalb (und weil es schneller ist, für die Micro-Optimierer) wird in diesem Fall idR ein Typecast verwendet:

      $a = -10.4;
      $b = 10.4;
      
      var_dump($a - (int)$a, $b - (int)$b);
      
      # gibt als Ausgabe:
      #
      # float(-0.4)
      # float(0.4)
      

      LG,
      CK

  3. Aloha ;)

    In meiner Variable steht

    $wert = 0.34;

    ich möchte gerne, alles was vor dem Komma ist streichen. Ich habe zwar alles gefunden zum runden und kürzen nach dem Komma, aber nichts für Vor dem Komma!

    Die Frage ergibt keinen Sinn - vor allem nicht mit diesem Beispiel. Mal geraten: du willst lediglich die Nachkommastellen, also von 12,34 nur 0,34 übrig behalten. "Kürzen vor dem Komma", Ja? In dem Fall wäre die Lösung

    $wert = 12.34;
    $wert = $wert - floor($wert);
    echo $wert; // 0.34
    

    Oder meintest du z.B. Runden auf 100er? Das kannst du durch Setzen eines negativen precision-Argument in der round-Funktion erhalten; siehe example #1 im Handbuch...

    Grüße,

    RIDER

    --
    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
    1. @@Camping_RIDER

      In dem Fall wäre die Lösung

      $wert = 12.34;
      $wert = $wert - floor($wert);
      echo $wert; // 0.34
      

      Mit „in dem Fall“ meinst du „für diesen Wert“?

      $wert = -12.34;
      $wert = $wert - floor($wert);
      echo $wert; // 0.66
      

      Hmm…

      LLAP 🖖

      --
      „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
      „Hat auf dem Forum herumgelungert …“
      (Wachen in Asterix 36: Der Papyrus des Cäsar)
      1. Aloha ;)

        In dem Fall wäre die Lösung

        $wert = 12.34;
        $wert = $wert - floor($wert);
        echo $wert; // 0.34
        

        Mit „in dem Fall“ meinst du „für diesen Wert“?

        $wert = -12.34;
        $wert = $wert - floor($wert);
        echo $wert; // 0.66
        

        ACK.

        $wert = $wert - (($wert < 0) ? ceil($wert) : floor($wert));
        

        Grüße,

        RIDER

        --
        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
        1. @@Camping_RIDER

          $wert = $wert - (($wert < 0) ? ceil($wert) : floor($wert));
          

          Sowas in der Art hatte ich auch im Sinn; aber ist nicht CKs Lösung besser?

          LLAP 🖖

          --
          „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
          „Hat auf dem Forum herumgelungert …“
          (Wachen in Asterix 36: Der Papyrus des Cäsar)
          1. Moin!

            aber ist nicht CKs Lösung besser?

            Nun, wir haben hier brauchbare Lösungen angeboten, die sich zunächst im einem Punkt unterscheiden: nämlich der Interpretation der Frage - und deshalb auch zu ganz verschiedenen Ergebnissen führen.

            Da sich Sabi aber gestern auf Nimmerwiedersehen verabschiedet hat werden wir wohl nie wissen, was diese meinte bzw. wollte.

            Jörg Reinholz

          2. Aloha ;)

            $wert = $wert - (($wert < 0) ? ceil($wert) : floor($wert));
            

            Sowas in der Art hatte ich auch im Sinn; aber ist nicht CKs Lösung besser?

            Doch, schätzungsweise schon - auf PHP bezogen ist CKs Lösung wohl die günstigere. Ich wollte die hier nur auch mal ausdrücklich aufschreiben - und wenn man unabhängig von PHP denkt kann es auch mal dazu kommen, dass in einer anderen Programmiersprache Typecasts nicht so günstig einzusetzen sind, es macht also Sinn, CKs Lösung zu verwenden und die andere trotzdem im Hinterkopf zu behalten.

            Grüße,

            RIDER

            --
            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[