2017-03-10 38 views
0

我有一個表單提交前使用jQuery來計算總數。它將貨幣符號和貨幣符號一起發送到表單處理腳本。這產生了一些str_replace沒有做我所需要的

警告:非數值遇到

的消息,所以我一直在使用str_replace。但是,下面的代碼仍然會生成錯誤。除了這一段代碼之外,它可以在其他任何地方使用,我無法找到解決方案。任何人都可以提供一些建議。

function netprice() { 
    $vatrate = 1.2; 
    $gross = str_replace('£','',$_POST['unit_Price']); 
    $net = round(($gross/$vatrate) , 2); 

    if (empty($gross)) { 
     echo"-"; 
    }else{ 
     echo $net; 
    } 
} 
+1

'$ _POST ['unit_Price']'包含什麼? 'var_dump()'並顯示給我們。 – Qirel

+0

嗨Qirel。 var_dump顯示這個字符串(0)「」 – Gareth

+0

這意味着在傳遞給PHP的表單中沒有相應的(注意大小寫)。另外,你應該使用'intval()'來明確地將變量轉換爲一個整數以避免將來的混淆。 – tyteen4a03

回答

1

您確實不應該使用表單發送貨幣符號。如果無法避免,可能會有其他字符,例如符號和數字之間的空格。 首先,你可以嘗試使所得到的值通過floatval()像這樣:

$gross = floatval(str_replace('£','',$_POST['unit_Price'])); 

如果仍然無法正常工作,使用正則表達式,而不是剝奪每個字符除了數字,逗號和點:

$gross = floatval(preg_replace('/[^0-9,.]/', '', $_POST['unit_Price'])); 
+0

這是一個重要的觀點。貨幣不應該在客戶端支配。 – Ibu

+0

這個伎倆。感謝那個Pejka。並感謝大家的所有建議。非常感謝:) – Gareth

+0

不客氣。根據Yaroslav Molchan的回答,您應該考慮使用filter_var()來獲取$ _POST值,而不是直接訪問它。使用原始表單輸入可能是一個漏洞。 – Pejka

0

變化££

還要檢查你的輸出,其數據包含$grossstr_replace

2

可以使用filter_var函數從字符串只得到號碼。

$gross = filter_var($_POST['unit_Price'], FILTER_SANITIZE_NUMBER_INT); 

如果你想獲得浮動使用:

$gross = filter_var($_POST['unit_Price'], FILTER_SANITIZE_NUMBER_FLOAT); 
+0

這是一個很好的解決方案,但如果它是一個浮點數而不是整數? – Qirel

+0

這不會按預期工作,因爲價格值可以浮動。例如'$ gross = filter_var('£1.2',FILTER_SANITIZE_NUMBER_INT);'將返回(字符串)12 – aperpen

+0

@Qirel將此添加到答案 –

2

而不是使用str_replace可能被留下空格或其他字符,你可以使用preg_replace在這裏的例子Remove non-numeric characters (except periods and commas) from a string

您代碼如下所示:

function netprice() { 

$vatrate = 1.2; 

$gross = preg_replace("/[^0-9,.]/", "", $_POST['unit_Price']); 
$net = round(($gross/$vatrate) , 2); 

    if (empty($gross)) { 

     echo"-"; 

    }else{ 

     echo $net; 
    } 
} 

preg_replace將去除除第一個參數中定義的字符之外的所有字符。

0

如果你的貨幣符號爲值之前,您可以使用SUBSTR:

<?php 
$price = substr('£1.2', 2); //1.2 

注意是b因爲£符號是一個特殊的字符,你必須減去2個第一個字符。你可以做一個的var_dump

檢查,如果你的貨幣符號爲末,你可以簡單地強制DE值是浮動:

$price = (float)'1.2£'; //1.2 
0

感謝所有幫助球員。我去Pejka的解決方案

$gross = floatval(preg_replace('/[^0-9,.]/', '', $_POST['unit_Price'])); 

我真的很感謝你的幫助。千謝謝:)

相關問題