2012-01-06 64 views
1

我正在使用貨幣等 -PHP中的點後需要2個小數位嗎?

5是可以的,因爲它被解釋爲5.00。但5.005並不像它在點之後有太多數字。

如何限制數字的數量,並顯示一個錯誤,如果有太多?

感謝

+0

不顧可能重複,請 – Gordon 2012-01-06 14:33:48

回答

2
$x = '5.005'; // declare as string to avoid floating point errors 
$parts = explode('.', $x); 
if (strlen($parts[1]) > 2) { 
    die("Too many digits"); 
} 
+1

只是出於興趣,有什麼用'$ X = '5' 發生​​;'?您可能需要修復,但+1,因爲這是迄今爲止最好的答案(涉及輸入,而不是輸出)。 – paxdiablo 2012-01-06 14:26:15

+1

你最終只會定義'$ parts [0]',$ parts [1]將是未定義的,但是其strlen爲0。 ))......''應該解決這個問題 – 2012-01-06 14:33:18

0

您可以格式化數字是這樣的:

$num = 50695.3043; 
$num = number_format($num, 2, '.'); 
echo $num; 

這將導致:

50695.30 

注意,這輪。所以1.566會回到1.57。

+2

看到我對diEcho的評論,這決定了輸出,而不是限制輸入。 – paxdiablo 2012-01-06 14:27:42

+0

同意,我誤讀了OP的問題 – 2012-01-06 14:28:38

0

我通常使用sprintf

$formatted = sprintf("%01.2f", $price); 

但也有許多其他的功能/解決方案,您可以使用。

+1

_瞭解問題,不要只讀它: - ) – paxdiablo 2012-01-06 14:29:51

2

number_format會爲您糾正它,但如果您在提供過多精度時想要出錯,則需要對其進行測試。

$x = 12.345; 
if ($x != number_format($x, 2)) { 
    // error! 
} 
0

下面的代碼將捕捉到了一些東西,從用戶輸入的字符串:

  • 太多小數點,如1.2.3
  • 第二部分中的兩位數以上(如果有),如1.234
  • 第一或第二部分中的任何非數字,如123.4a1a3.45
  • 第一和第二部分空,如.

$x = '12.34'; 
$parts = explode('.', $x); 
$nm0a = preg_match ('/^[0-9]*$/', $parts[0]); 
$nm0b = preg_match ('/^[0-9]+$/', $parts[0]); 
$nm1a = preg_match ('/^[0-9]*$/', $parts[1]); 
$nm1b = preg_match ('/^[0-9]+$/', $parts[1]); 

if (count ($parts) > 2)   { die ("Too many decimal points"); } 
if ($nm0a == 0)     { die ("Non-numeric first part"); } 
if ($nm1a == 0)     { die ("Non-numeric second part"); } 
if (($nm0b == 0) && ($nm1b == 0)) { die ("Both parts empty"); } 
if (strlen ($parts[1]) > 2)  { die ("Too many digits after decimal point"); } 

die ("Okay"); # Only here to provide output.