Probleme mit FLOAT Werten nach Update auf IPS 5

Hallo,

ich parse eine Webseite und ziehe mir dann einztelne Werte und schreibe diese in die Datenbank. Hat soweit auch immer funktioniert. Nur kann ich nun keine Werte wie 55,22 im INSERT Befehl als Value übergeben. Der Wert wird zwar in die Datenbank geschrieben - allerdings mit dem Hinweis: Data truncated for column ‚Temperatur‘ at row 1. In die Datenbank wird dann der Wert 55 geschrieben…

Es handelt sich um ein FLOAT Datenbankfeld.

Ich habe nun gedacht ok - dann nutze ich doch diese Funktion und floate den Wert. In der Ausgabe bei IPS-Management Console stelle ich nun fest, dass das Komma nicht durch einen Punkt ersetzt wird. Selbst folgendes Beispiel liefert folgenden Output auf der Console: 19332,35

<?php
function Getfloat($str) {
  if(strstr($str, ",")) {
    $str = str_replace(".", "", $str); // replace dots (thousand seps) with blancs
    $str = str_replace(",", ".", $str); // replace ',' with '.'
  }
 
  if(preg_match("#([0-9\.]+)#", $str, $match)) { // search for number that may contain '.'
    return floatval($match[0]);
  } else {
    return floatval($str); // take some last chances with floatval
  }
}

echo Getfloat("$ 19.332,35-"); // will print: 19332.35
?>

Habt ihr eine Idee?

Grüße

intval könnte helfen. Float…Fließkomma.

mmm mit INTVAL mache ich doch aus 55,22 dann 55… Ich will im Insert Statement, welches ich mir durch mein PHP Skript zusammenbaue, anstatt ein „,“ einen „.“

Damit erreiche ich, dass nichts abgeschnitten wird.

Oder habe ich dich da falsch verstanden?

Was kommen denn für Rohdaten an. Man kann auch alles irgendwohin zerlegen ohne das es überhaupt nötig ist.

<?
$float = "12,55";
echo $float."
";echo intval($float);
?>

Nicht täuschen lassen!
Echo gibt einen Float immer in der jeweiligen Local aus, also bei Deutsch immer mit Komma.
Ebenso wenn ein Float zu einen String konvertiert wird (z.b. beim verketten zu dem SQL Befehl).
Mit PHP: number_format - Manual kann man den Float in das gewünschte Format bringen, unabhängig der Sprache :slight_smile:
Michael

Dann tipp mal mal 12,55 ohne Anführungszeichen ein.

Aber Du hast Recht. Deswegen hab ich nie in eine Datenbank geschrieben mit Vorgabe als Feld. Datenbank ist da eisern.

Wenn ich dein Skript ausführe kommt als Ergebnis 12 an …

12.55 wäre mein Wunsch :slight_smile:

Ich mache es nochmal etwas konkreter:

folgendes Array bearbeite ich so: $output_anlage = str2num($e->innertext);

(
    [0] => 21,0 °C
    [1] => 21,0 °C
    [2] => 0,0 %
    [3] => 21,0 °C
    [4] => 21,0 °C
    [5] => 0,0 %
    [6] => 19,5 °C
    [7] => 32,2 °C
    [8] => 23,6 °C
    [9] => 32,5 °C
    [10] => 21,1 °C
    [11] => 30,9 °C
    [12] => 32,5 °C
    [13] => 53,0 °C
    [14] => 45,0 °C
    [15] => 36 Hz
    [16] => 260 m³/h
    [17] => 33 Hz
    [18] => 270 m³/h
    [19] => 23,8 °C
    [20] => 0 
)

Die str2num Funktion sieht so aus:

function str2num($str){
  if(strpos($str, '.') < strpos($str,',')){
            $str = str_replace('.','',$str);
            $str = strtr($str,',','.');
        }
        else{
            $str = str_replace(',','',$str);
        }
        return (float)filter_var($str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);$str;
}

Ich sehe da irgendwie vor lauter Bäumen den Wald nicht mehr … Habe mal auf meinem Testsystem in der Version 4 das Script aus meinem 1. Post getestet. Dort wird ein Punkt ausgegeben…???

Ohne jetzt dein Script getestet zu haben.
Es liegt eher an dem was anschließend passiert. Also wenn du die Werte irgendwo wieder als String zb. für der SQL Befehl weiter verarbeitest.
PHP sagt:
Anintegerorfloatis converted to astringrepresenting the number textually (including the exponent part forfloats). Floating point numbers can be converted using exponential notation (4.1E+6).

Hinweis:

The decimal point character is defined in the script’s locale (category LC_NUMERIC). See the*setlocale()function.

Da setlocal in IPS nicht funktioniert, nimm einfach number_format.
Und ja … auch Echo konvertiert es in die local!
Echo zeigt nicht den wahren Inhalt einer Variable.
Das macht nur var_dump.
Michael