PHP String zum Float


120

Ich bin mit PHP überhaupt nicht vertraut und hatte eine kurze Frage.

Ich habe 2 Variablen pricePerUnitund InvoicedUnits. Hier ist der Code, der diese auf Werte setzt:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Wenn ich dies ausgebe, erhalte ich die richtigen Werte. Sagen wir in 5000Rechnung gestellte Einheiten und 1.00für den Preis.

Jetzt muss ich den Gesamtbetrag anzeigen. Wenn ich diese beiden miteinander multipliziere, funktioniert es nicht (wie erwartet sind dies Zeichenfolgen).

Aber ich habe keine Ahnung, wie man Variablen in PHP analysiert / umwandelt / konvertiert.

Was soll ich machen?

Antworten:


201
$rootbeer = (float) $InvoicedUnits;

Sollte es für Sie tun. Schauen Sie sich Type-Jonglieren an . Sie sollten auch die Konvertierung von Zeichenfolgen in Zahlen lesen .


Es ist die einfachste Methode. Aber gelegentlich habe ich Probleme mit bestimmten Datenbankkonfigurationen und VARCHAR>11in der Länge. Ich habe noch nicht genau eingegrenzt , warum.
Talvi Watia

2
^ Erwähnenswert, dass (float) 0 aus der Zeichenfolge entfernt, wenn es die erste Ziffer ist

Beachten Sie auch, dass "11.000,00" 11 anstelle der erwarteten 11000,00
CodeJunkie

64

Sie möchten die nicht Gebietsschema-fähige floatvalFunktion :

float floatval (gemischtes $ var) - Ruft den float-Wert eines Strings ab.

Beispiel:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343

4
Ein großes Lob für die Erwähnung des Gebietsbewusstseins. Ich habe gerade 1,5 Stunden damit verbracht, ein Problem aufzuspüren, das durch verschiedene Gebietsschemas verursacht wurde (float), die auf dem ersten Server zu "," und auf dem zweiten zu "," konvertierten
Dr. Gianluigi Zane Zanettini

23

Wenn der Benutzer 1,00,000 schreibt, zeigt floatvar einen Fehler an. So -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Das ist viel zuverlässiger.

Verwendung :

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

7
Statt ereg Verwendung Preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
Ja, ereg, diese Funktion wurde VERRINGERT. Also muss preg statt ereg verwenden :)
HADI

9

Der Umgang mit Markups in Floats ist keine triviale Aufgabe. In der englischen / amerikanischen Notation formatieren Sie mehr als tausend 46*10-2:

1,000.46

Aber in Deutschland würden Sie Komma und Punkt ändern:

1.000,46


Dies macht es wirklich schwierig, die richtige Anzahl in mehrsprachigen Anwendungen zu erraten.
Ich empfehle dringend, Zend_Measuredas Zend Framework für diese Aufgabe zu verwenden. Diese Komponente analysiert die Zeichenfolge in einem Gleitkommawert der Benutzersprache.


3
Heutzutage (+3 Jahre) könnte man NumberFormatter ab PHP 5.3 mit der intlErweiterung verwenden.
Zamnuts

1
PHP 5.3 war verfügbar, als ich die Frage beantwortete, aber bis zu Ihrem Kommentar war mir diese einzelne Funktion nicht bekannt, da es Dutzende von Bibliotheken gibt, die etwas Ähnliches tun. Aber sie werden keine so gute Abdeckung von Gebietsschemas haben wie die intl-Erweiterung. Danke, ich werde versuchen, mich daran zu erinnern.
Tobias P.

1

Verwenden Sie diese Funktion, um einen Gleitkommawert aus einem beliebigen Textstil umzuwandeln:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Diese Lösung ist nicht von Gebietsschemaeinstellungen abhängig. Somit können Benutzer für Benutzereingaben Float-Werte nach Belieben eingeben. Dies ist sehr hilfreich, z. B. wenn Sie ein Projekt haben, das nur auf Englisch ist, aber von Menschen auf der ganzen Welt verwendet wird und möglicherweise nicht daran denkt, dass das Projekt einen Punkt anstelle eines Kommas für Gleitkommawerte wünscht. Sie könnten Javascript in den Mix werfen und die Standardeinstellungen des Browsers abrufen, aber immer noch setzen viele Leute diese Werte auf Englisch, geben aber immer noch 1,25 statt 1,25 ein (insbesondere, aber nicht beschränkt auf die Übersetzungsbranche, Forschung und IT).


irgendwelche Kommentare darüber, warum dies schlecht ist / wo es fehlschlägt?
Hafenkranich

oder gibt es einen ebenfalls flexiblen weg, der schneller ist?
Hafenkranich

1
Es wird das e-Flag verwendet, das "nicht mehr unterstützt" wird. Das ist meine Vermutung.
Leif

0

Ich hatte ein Problem mit der Standardmethode:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

Wenn es keine gültige Nummer gibt, sollte der Parser keine Nummer zurückgeben, sondern einen Fehler auslösen. (Dies ist eine Bedingung, die ich in meinem Code YMMV zu erfassen versuche.)

Um dies zu beheben, habe ich Folgendes getan:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Bevor ich die Konvertierung weiter verarbeite, kann ich einen Fehler überprüfen und zurückgeben, wenn keine gültige Analyse der Zeichenfolge vorhanden ist.


0

Wenn Sie Werte verarbeiten müssen, die nicht separat konvertiert werden können, können Sie folgende Methode verwenden:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

Sie können diesem Link folgen , um mehr darüber zu erfahren, wie Sie eine Zeichenfolge / Zahl in PHP in Zahl / Gleitkomma / Dezimalzahl konvertieren. HIER IST, WAS DIESER LINK SAGT ...

Methode 1: Verwenden der Funktion number_format (). Mit der Funktion number_format () wird eine Zeichenfolge in eine Zahl konvertiert. Bei Erfolg wird die formatierte Zahl zurückgegeben, andernfalls wird bei Fehlschlag E_WARNING ausgegeben.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Methode 2: Verwenden von Typumwandlung: Typecasting kann eine Zeichenfolge direkt in einen float-, double- oder integer-Primitivtyp konvertieren. Dies ist der beste Weg, um eine Zeichenfolge ohne Funktion in eine Zahl umzuwandeln.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Methode 3: Verwenden der Funktionen intval () und floatval (). Die Funktionen intval () und floatval () können auch verwendet werden, um den String in seine entsprechenden Integer- bzw. Float-Werte zu konvertieren.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Methode 4: Durch Hinzufügen von 0 oder durch Ausführen mathematischer Operationen. Die Zeichenfolgennummer kann auch in eine Ganzzahl oder ein Gleitkommawert umgewandelt werden, indem der Zeichenfolge 0 hinzugefügt wird. In PHP wird bei der Ausführung mathematischer Operationen die Zeichenfolge implizit in eine Ganzzahl oder einen Gleitkommawert konvertiert.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.