2017-03-22 1 views
1

Ich arbeite gerade mit Amazon API und es gibt den niedrigsten verfügbaren Preis im Format: "EUR xxx, xx" (zum Beispiel "EUR 23,99 ").Summe der drei "EUR xxx, xx" Werte in PHP/Javascript berechnen

Jetzt möchte ich die Summe von drei Preisen berechnen, aber da der Wert nicht nur Zahlen ist habe ich keine Ahnung, wie das geht.

Ich versuchte

$a = $ergebnis['price1']; 
$b = $ergebnis['price2']; 
$c = $ergebnis['price3']; 
$string = "a + b + c"; 

$result = eval('return ' . preg_replace('/([a-zA-Z0-9])+/', '\$$1', $string) . ';'); 
echo $result; 

Aber diese Rückkehr hat zu keinem Ergebnis.

+0

ist $ a = "EUR", $ b = xxx und $ c = xx ?? –

+0

Nein, $ a = EUR xxx, xx $ b = EUR xxx, xx $ c = EUR xxx, xx – Pintolus

+1

Bleib weg von eval(). Weit weit weg. – mwieczorek

Antwort

1

Sie müssen zwei Schritte folgen:

  • entfernen "EUR",
  • Konvertit float

"EUR" explodieren mit explodieren explode(" ", $price)[1] Zeichenfolge durch Leerzeichen zu entfernen. Dann möchten Sie Kommas in Punkte ändern und in Float konvertieren, dies kann durch floatval() und str_replace() erfolgen.

function toFloat($price) { 
    return floatval(str_replace(',', '.', explode(" ", $price)[1])); 
} 

$a = toFloat($ergebnis['price1']); 
$b = toFloat($ergebnis['price2']); 
$c = toFloat($ergebnis['price3']); 
$result = $a + $b + $c; 
echo $result; 
+0

Vielen Dank :) – Pintolus

+0

Verwenden von 'str_replace' und' explode' verwenden mehr Speicher und CPU-Zyklen als Regex, die auf Byte-Ebene arbeitet. – mwieczorek

+1

@mwieczorek Ich habe gerade unsere beiden Codes mit 1mln Iterationen überprüft. Ihr Code ist 30-40% langsamer als meins. Die Änderung von 'floatval()' zu '(float)' macht den Unterschied zwischen 40 und 55%. – Linek

-1

können Sie .split ("") auf jedem EUR 23,99 verwenden.

var str = "EUR 23,99"; 
var result = str.split(" "); 

Split gibt ein Array von Elementen, die durch ein Trennzeichen, in diesem Beispiel ites "" so wird u als Ergebnis erhalten EUR geteilt werden [0] und 23,99 als Ergebnis [1], so kann u alle konvertieren in die gleiche Währung und konvertiere die Zahl aus der Zeichenkette und füge sie zur Summe hinzu

-2

Ich vermute, dass Sie Strings von der API erhalten. Sie können durch einfaches Umwandeln dieser Zahlen mit ihnen berechnen:

$a = floatval($ergebnis['price1']); 
$b = floatval($ergebnis['price2']); 
$c = floatval($ergebnis['price3']); 

Die Funktion floatval(); den Schwimmer Wert zurückgibt.

+0

Sehen Sie [Beispiel 2 in der Dokumentation] (http://php.net/manual/en/function.floatval.php), um zu sehen, wie 'floatval' sich auf einer Zeichenkette wie' EUR 24,99' verhält (zB nicht numerisches Zeichen ganz links). – ccKep

+0

Ich denke, das Entfernen von Zeichen aus einem String ist kein großes Problem, aber okay: 'preg_replace ("/[^ 0-9.,] +/G "," ", $ only_numbers);' – poldi1405

0

Ersetzen Sie die Separatoren (für Dezimalstellen Komma zu Punkt und für Tausende Punkt auf Komma), und Sie werden sie zu fassen in der Lage:

$price1 = explode(" ", $ergebnis['price1']); 
$price2 = explode(" ", $ergebnis['price2']); 
$price3 = explode(" ", $ergebnis['price3']); 

$a = floatval(str_replace(',', '.', str_replace('.', '', $price1[1]))); 
$b = floatval(str_replace(',', '.', str_replace('.', '', $price2[1]))); 
$c = floatval(str_replace(',', '.', str_replace('.', '', $price3[1]))); 

$result = $a + $b + $c; 
echo $result; 
+1

Sie vergessen die Währungsteil ('EUR 24.99' ist nicht mit floatval gemäß den Dokumenten analysierbar). – ccKep

+0

Ja, hat nicht funktioniert :(aber danke – Pintolus

+0

Richtig, ich habe nicht bemerkt, dass Sie das hatten, sorry.Ich aktualisierte meine Antwort – gmc

1

Verwendung Regex:

$string = 'EUR 23,99'; 

function currencyToFloat($string) { 
    return (float) preg_replace("/^[A-Z]{3}\s([\d]+)[,.]([\d]+)/", "$1.$2", $string); 
} 

Es konvertiert ein aus drei Buchstaben bestehender Währungscode plus ein Leerzeichen und eine beliebige Zahl (europäisch oder international formatiert) in einen Gleitkommawert.

echo currencyToFloat($string); // EUR 23,99 --> 23.99