WernerK: US Betrag ins deutsche Format

Hallo,
ein script liest eine Datei ein die Beträge im US Format hat.
Ich habe es so wie unten mit number_format versucht, den Betrag ins deutsche Format zu bringen.

$revenue = "122,000.00";
$number_format_german = number_format($revenue, 2, ',', '.');

Hier kommt aber eine Meldung wie "a non well formed..." Ich vermute das number_format nur mit dem Punkt als Tausender Trennzeichen funktioniert?
Wie könnte man diesen Betrag einfach ins deutsche format bringen also;

122.000,00

Gruss
Werner

  1. Lieber WernerK,

    Du könntest ja alle Trennzeichen entfernen und vor die letzten zwei Ziffern einen Punkt setzen. Das Ergebnis dieser Stringoperation fütterst Du in die Funktion number_format(). Es bliebe nur zu prüfen, ob die Beträge grundsätzlich und immer ohne Ausnahme als Dezimalzahlen angegeben werden, oder ob das ".00" am Ende auch fehlen könnte - das wäre dann ein noch zu lösendes Problem.

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. Hallo Felix,

      so ähnlich habe ich es jetzt mal versucht:

      $revenue1 = "122,000.00";
      $revenue2 = str_replace(",","",$revenue1);//komma entfernen
      $number_format_german = number_format($revenue2, 2, ',', '.');

      Die Anzeige würde so jetzt stimmen mit

      122.000,00

      Was macht man jetzt aber, wenn man diesen Betrag in der MySQL db in einer Spalte decimal(10,2) speichern möchte.
      Wäre es am besten das Komma UND den Punkt zu entfernen, also
      12200000
      Weil mit Komma oder Punkt in der DB bei Typ decimal geht ja nicht oder?
      Und varchar ist ja auch nicht gerade der richtige Typ

      Gruss
      Werner

      1. Lieber WernerK,

        Was macht man jetzt aber, wenn man diesen Betrag in der MySQL db in einer Spalte decimal(10,2) speichern möchte.

        Du benutzt doch schon DECIMAL, wo ist das Problem?

        Liebe Grüße,

        Felix Riesterer.

        --
        "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        1. Hallo,

          Du benutzt doch schon DECIMAL, wo ist das Problem?

          ja schon aber man kann doch in der decimal Spalte keinen Betrag mit Komma oder Punkt speichern oder? (zumindest geht es bei mit nicht)
          Man müsste also den Betrag 122.000,45 als
          12200045 speichern oder?

          Gruss
          Werner

          1. Lieber WernerK,

            Man müsste also den Betrag 122.000,45 als
            12200045 speichern oder?

            hast Du schon 122000.45 probiert?

            Das "decimal" steht für eine Dezimalzahl. Mathematisch werden die im Deutschen ausschließlich mit einem einzigen Komma als Trenner zwischen Ganzzahl und Nachkommastellen notiert. Jegliche weiteren Trenner sind ausschließlich für die bessere Lesbarkeit geschrieben, was aber keinesfalls einer exakten Schreibweise entspricht, wie man schon im Mathe-Unterricht immer wieder eingetrichtert bekam (oder noch bekommt).

            Analog zum Komma im Mathematikunterricht benutzt man in den Computersprachen dazu den Punkt.

            Liebe Grüße,

            Felix Riesterer.

            --
            "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
            1. hast Du schon 122000.45 probiert?

              Ja, da kommt es zu einer Fehlermeldung
              Note: #1265 Data truncated for column 'revenue' at row 1
              und dann steht aber
              122000
              drin.

              Gruss
              Werner

              1. Hi,

                hast Du schon 122000.45 probiert?
                Ja, da kommt es zu einer Fehlermeldung
                Note: #1265 Data truncated for column 'revenue' at row 1
                und dann steht aber
                122000
                drin.

                dann hast du entweder den Spaltentyp DECIMAL durch die Definition von 0 Nachkommanstellen kastriert, oder der Typ ist in Wirklichkeit irgendein Integer-Typ. Also ein Fehler im Tabellendesign.

                Ciao,
                 Martin

                --
                Butterkeksverteiler zu werden ist vermutlich eine der wenigen beruflichen Perspektiven, die sich noch bieten, wenn man einen an der Waffel hat.
                  (wahsaga)
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Hallo,

                  dann hast du entweder den Spaltentyp DECIMAL durch die Definition von 0 Nachkommanstellen kastriert,

                  ja so war es.Danke. Die Spalte war als decimal(10,0) deklariert. Ich dachte ursprünglich es wäre decimal(10,2)
                  Jetzt klappt es auch wenn man z.b. 122000.45 eingibt, das der Punkt in der DB drin ist als Trenner der "Nachkommazahl".
                  Man könnte ja aber nicht den Wert 122.000.45 speichern. Wie würdest du diesen Betrag (also in deutscher Schreibweise 122.000,45 speichern?

                  Gruss
                  Werner

                  1. Tach!

                    Wie würdest du diesen Betrag (also in deutscher Schreibweise 122.000,45 speichern?

                    Wenn Eingaben hereinkommen, die irgendwie formatiert sind, dann sollte man sie erst normalisieren (in ein vom Programm verarbeitbares Format bringen, in dem Fall Ziffern und Dezimalpunkt und nichts weiter). Mit den normalisierten Daten kann man dann arbeiten soweit es geht und die Aufgabe es erfordert. Bei der Ausgabe kann man sie dann bei Bedarf wieder formatieren.

                    dedlfix.

                  2. Moin,

                    dann hast du entweder den Spaltentyp DECIMAL durch die Definition von 0 Nachkommanstellen kastriert,
                    ja so war es.Danke. Die Spalte war als decimal(10,0) deklariert. Ich dachte ursprünglich es wäre decimal(10,2)

                    ja, kaum macht man's richtig, schon geht's. ;-)

                    Jetzt klappt es auch wenn man z.b. 122000.45 eingibt, das der Punkt in der DB drin ist als Trenner der "Nachkommazahl".

                    Nein, da ist kein Punkt drin.

                    Man könnte ja aber nicht den Wert 122.000.45 speichern. Wie würdest du diesen Betrag (also in deutscher Schreibweise 122.000,45 speichern?

                    Nochmal: Ein numerisches Feld in der DB (DECIMAL, INT, was auch immer) speichert Zahlenwerte, nicht deren geschriebene Repräsentation. Deine Frage ist deshalb sinnlos.

                    Ciao,
                     Martin

                    --
                    Zwei Freundinnen tratschen: "Du, stell dir vor, die Petra kriegt ein Kind!" - "Ich kann mir schon denken, von wem." - "Dann ruf sie mal schnell an, das würde ihr bestimmt weiterhelfen."
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  3. Hallo,

                    Man könnte ja aber nicht den Wert 122.000.45 speichern.

                    so einen Wert gibt es nicht, da hat jemand die letzte Null verschlampt...

                    Gruß
                    Kalk

            2. Hallo,

              Mathematisch werden die im Deutschen ausschließlich mit einem einzigen Komma als Trenner zwischen Ganzzahl und Nachkommastellen notiert. Jegliche weiteren Trenner sind ausschließlich für die bessere Lesbarkeit geschrieben, was aber keinesfalls einer exakten Schreibweise entspricht, wie man schon im Mathe-Unterricht immer wieder eingetrichtert bekam (oder noch bekommt).

              und da bekam oder bekommt man ebenso eingetrichtert, dass man als Gliederungszeichen bitte, bitte keinen Punkt verwenden möge, auch wenn sich diese Unart millionenfach verbreitet hat (da war doch mal was mit den Fliegen), sondern bitte ein Leerzeichen.
              Wenn's die typographischen Möglichkeiten hergeben, eins mit halber Breite. Und selbstverständlich ein nicht-umbrechendes. Gelegentlich sieht man auch die Dreier-Gruppierung mit Apostroph, finde ich auch noch okay.

              Ciao,
               Martin

              --
              Letztlich basiert alles auf dem Feuer, dem Rad, der Eins und der Null.
                (Gernot Back)
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hallo

    Hallo,
    ein script liest eine Datei ein die Beträge im US Format hat.
    Ich habe es so wie unten mit number_format versucht, den Betrag ins deutsche Format zu bringen.

    $revenue = "122,000.00";
    $number_format_german = number_format($revenue, 2, ',', '.');

    Hier kommt aber eine Meldung wie "a non well formed..." Ich vermute das number_format nur mit dem Punkt als Tausender Trennzeichen funktioniert?

    Nein. Das Problem ist, dass du der Funktion keine echte™ Zahl sondern einen als String mit einer formatierten Ziffernfolge anbietest. Mit einer unformatierten Zahl (122000.00) oder einem solchen String ("122000.00") wird die Funktion funktionieren. Die Beschreibung der Funktion ist da eindeutig (string number_format ( float $number [, int $decimals = 0 ] )). Als erster Parameter wird eine Fließkommazahl erwartet. Ein String, der passend formatiert ist, wird wegen der automatischen Typumwandlung ebenso akzeptiert.

    Wie könnte man diesen Betrag einfach ins deutsche format bringen also;

    122.000,00

    Mit number_format. Zuvor muss der amerikanische Zahlenstring aber erst in ein Zahlenformat gebracht werden. Wenn du genau weißt, dass du ein definiertes Eingangsformat bekommst, kannst du z.B. alle Kommata aus dem String löschen, die vor dem einen Punkt auftreten.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
    Terry Pratchett, "Wachen! Wachen!"
    ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}