Mam zmienną, której procent chciałbym obliczyć i ustawić jako nową zmienną.

Tak próbowałem, ale pojawia się błąd.

$amount = $_POST['amount'];
$newamount = $amount*0.05;

Ale otrzymuję błąd:

Fatal error: `Uncaught TypeError: Unsupported operand types: string * float in C:\xampp\htdocs\...

$_POST['amount'] to kwota w dolarach z symbolem i 2 miejscami po przecinku, np. „12,00 USD”.

Co ja robię źle?

php
-1
McChris_ Made_It 18 czerwiec 2021, 15:51

4 odpowiedzi

Najlepsza odpowiedź

Zakładając, że $_POST['amount'] wygląda jak liczba, ale jest w jakiś sposób interpretowany jako ciąg, być może będziesz musiał rzucić go na liczbę:

$newamount= (float) $amount * 0.05;

Właściwie, nawet jeśli $amount będzie "1,23", powyższa linia zadziała; nie trzeba go rzucać. Problemem jest $kwota = 12,00;

W takim przypadku sugeruję usunięcie pierwszego znaku. Jeśli wiesz, że zawsze jest $, możesz użyć ltrim, aby usunąć wszystkie wiodące znaki, które są $

$amount = ltrim($_POST['amount'], '$');

Jeśli mógłby to być jeden z kilku różnych symboli waluty, np. wiesz, że zawsze będzie to jedno z £, $ lub €, możesz użyć tego w następujący sposób:

$amount = ltrim($_POST['amount'], '$£€');
1
duncan 18 czerwiec 2021, 14:37

Innym sposobem na upewnienie się, że zawsze masz rzeczywistą liczbę, jest usunięcie wszystkich znaków nienumerycznych. To pomaga, jeśli kwota $ wyniesie 12 345,67 $

$amount = preg_replace("/[^0-9.-]/", '', $_POST['amount']);
2
aynber 18 czerwiec 2021, 13:04

Prześlij swój $amount na int/float:


if (isset($_POST['amount'])) {
    $amount = intval($_POST['amount']);

    $newamount = $amount * 0.5;
}

Aby przeanalizować walutę w zależności od lokalizacji, możesz użyć NumerbFormatter (wymaga rozszerzenia php_intl):

$_POST['amount'] = '$12.00';

//----

$amount = $_POST['amount'];

$fmt = new NumberFormatter('en_US', NumberFormatter::CURRENCY);

$newamount = $fmt->parseCurrency($amount, $currency) * 0.5;

1
Justinas 18 czerwiec 2021, 13:25

PHP nie wie, czym są „dolary”. Kiedy widzi "12,00 USD", nie wie, że znak dolara jest oddzielony i traktuje resztę jako liczbę. Jeśli chodzi o PHP, prośba o "$12.00" * 0.05 nie różni się od proszenia o "$$$12.00$$$" * 0.05 lub "potato" * 0.05.

Masz więc dwie możliwości:

  • Zmień formularz tak, aby przesłana wartość była tylko liczbami. Jeśli został wprowadzony przez użytkownika, napisz kod weryfikacyjny, który sprawdzi, czy jest tylko liczbą, np. if ( ! preg_match('/^\d+\.\d{2}$/', $_POST['amount']) ) { show_wrong_amount_error_message(); }
  • Usuń „$” z przodu przed przetworzeniem, korzystając z sugestii Duncana dotyczącej $amount = ltrim($_POST['amount'], '$'); lub sugestia Aynby dotycząca $amount = preg_replace("/[^0-9.-]/", '', $_POST['amount']);

Możesz też połączyć te dwie rzeczy: sprawdź, czy ma dokładnie znak dolara, liczbę dolarów i liczbę centów; następnie odrzuć znak dolara i kontynuuj:

if ( preg_match('/^\$(\d+\.\d{2})$/', $_POST['amount'], $matched_parts) ) { 
    $amount = (float)$matched_parts[1];
}
else {
    show_wrong_amount_error_message();
}

Powinieneś również rozważyć traktowanie pieniędzy jako całkowitą liczbę centów, a nie zmiennoprzecinkową liczbę dolarów, ponieważ liczby zmiennoprzecinkowe nie są precyzyjne. Możesz więc dostosować powyższe, aby zamiast tego podać kwotę w centach:

if ( preg_match('/^\$(\d+)\.(\d{2})$/', $_POST['amount'], $matched_parts) ) { 
    $amount_cents = (int)$matched_parts[1] * 100 + (int)$matched_parts[2];
}
else {
    show_wrong_amount_error_message();
}
0
IMSoP 18 czerwiec 2021, 13:22