2009-06-13 29 views
23

Trong PHP 5, tôi sử dụng intval() bất cứ khi nào tôi nhận được số làm đầu vào. Bằng cách này, tôi muốn đảm bảo rằng tôi không nhận được chuỗi hoặc số nổi. Số đầu vào của tôi tất cả phải là số nguyên. Nhưng khi tôi nhận được số> = 2147483647, giới hạn số nguyên đã ký được vượt qua.PHP: intval() tương đương với số> = 2147483647

Tôi có thể làm gì để có giá trị intval() tương đương với các số ở mọi kích thước?

Đây là những gì tôi muốn có:

<?php 
$inputNumber = 3147483647.37; 
$intNumber = intvalEquivalent($inputNumber); 
echo $intNumber; // output: 3147483647 
?> 

Cảm ơn bạn rất nhiều trước!

Chỉnh sửa: Dựa trên một số câu trả lời, tôi đã cố gắng viết mã một hàm tương đương. Nhưng nó không hoạt động chính xác như intval(). Làm thế nào tôi có thể cải thiện nó? Điều gì là sai với nó?

function intval2($text) { 
    $text = trim($text); 
    $result = ctype_digit($text); 
    if ($result == TRUE) { 
     return $text; 
    } 
    else { 
     $newText = sprintf('%.0f', $text); 
     $result = ctype_digit($newText); 
     if ($result == TRUE) { 
      return $newText; 
     } 
     else { 
      return 0; 
     } 
    } 
} 
+0

Vì vậy, những gì chính xác không hoạt động trong đó và những gì xảy ra với các giải pháp khác ở đây, bao gồm cả regex? –

Trả lời

20

Hãy thử chức năng này, nó sẽ loại bỏ bất kỳ số thập phân nào làm khoảng trắng và loại bỏ bất kỳ ký tự không phải là số nào.

<?php 
function bigintval($value) { 
    $value = trim($value); 
    if (ctype_digit($value)) { 
    return $value; 
    } 
    $value = preg_replace("/[^0-9](.*)$/", '', $value); 
    if (ctype_digit($value)) { 
    return $value; 
    } 
    return 0; 
} 

// SOME TESTING 
echo '"3147483647.37" : '.bigintval("3147483647.37")."<br />"; 
echo '"3498773982793749879873429874.30872974" : '.bigintval("3498773982793749879873429874.30872974")."<br />"; 
echo '"hi mom!" : '.bigintval("hi mom!")."<br />"; 
echo '"+0123.45e6" : '.bigintval("+0123.45e6")."<br />"; 
?> 

Dưới đây là sản phẩm được sản xuất:

"3147483647.37" : 3147483647 
"3498773982793749879873429874.30872974" : 3498773982793749879873429874 
"hi mom!" : 0 
"+0123.45e6" : 0 

Hy vọng rằng sẽ giúp!

+0

Cảm ơn rất nhiều, đó chính xác là những gì tôi đang tìm kiếm. – caw

+2

Chức năng này có khả năng gây hại khi xử lý các số âm: trong khi 'intval (-100) == -100',' bigintval (-100) == 0'. – Ferenjito

2

Hoặc sử dụng number_format($inputNumber, 0, '', '')

Hoặc nếu bạn chỉ muốn kiểm tra xem nó một số nguyên sau đó sử dụng ctype_digit($inputNumber)

Không sử dụng đề xuất is_numeric, cũng như nổi là số. ví dụ. "+ 0123.45e6" được chấp nhận bởi is_numeric

+0

float sẽ vẫn tràn này. –

+0

tràn tràn không quan trọng, vì vậy nó có vẻ hữu ích. Vui lòng xem chỉnh sửa của tôi trong câu hỏi. – caw

2

Ngoài number_format, bạn có thể sử dụng sprintf:

sprintf("%.0f", 3147483647.37) // 3147483647 

Tuy nhiên, cả hai giải pháp bị tràn float, ví dụ:

sprintf("%.0f", 314734534534533454346483647.37) // 314734534534533440685998080 
+0

Cảm ơn bạn! Vui lòng xem bản chỉnh sửa của tôi trong câu hỏi. Đây có phải là một hàm tương đương tốt không? – caw

+1

@Artem: Nó không chỉ bị tràn tràn, nó cũng làm tròn. sprintf ("%. 0f", 1.5) trả về 2, trong khi intval (1.5) trả về 1. – mercator

6

bạn cũng có thể sử dụng cụm từ thông dụng để xóa mọi thứ sau các phần số intial:

<?php 
$inputNumber = "3147483647.37"; 
$intNumber = preg_replace('/^([0-9]*).*$/', "\\1", $inputNumber); 
echo $intNumber; // output: 3147483647 
?> 
+0

Tôi nghĩ rằng có một lỗi với regex của bạn, mã của bạn không xuất ra bất cứ điều gì cả. – defines

+0

xin lỗi. nó đã được sửa. – SztupY

+0

Cảm ơn bạn! :) Câu trả lời của bạn rất quan trọng kể từ khi Dustin Fineout sử dụng regexp của bạn ... – caw

0

Nếu bạn muốn xử lý các số có độ chính xác tùy ý, bạn sẽ cần sử dụng tiện ích mở rộng gmp. Ví dụ, hàm gmp_init() chuyển đổi một chuỗi thành một đối tượng tài nguyên gmp. nhược điểm là bạn phải sử dụng các chức năng khác của phần mở rộng đó để tiếp tục xử lý đối tượng đó. Chuyển đổi nó trở lại một chuỗi được thực hiện bằng cách sử dụng gmp_strval(), ví dụ.

$gmpObject = gmp_init($string, 10); 
if ($gmpObject === FALSE) { 
    # The string was not a valid number, 
    # handle this case here 
} 
echo gmp_strval($gmpObject); 

Bạn có thể muốn chỉ xác minh rằng chuỗi là đại diện cho một số hợp lệ và sử dụng chuỗi riêng của mình, nếu bạn không có ý định làm bất cứ thao tác trên giá trị. Điều đó có thể được thực hiện bằng cách sử dụng cụm từ thông dụng:

$containsInt = preg_match('/^\d+$/', $string); 
# Or for floating point numbers: 
$containsFloat = preg_match('/^\d+(.\d+)?$/', $string); 
echo $string; 

Một tùy chọn khác là sử dụng is_numeric(). Nhưng chức năng đó có nhiều chuyển đổi hơn bạn có thể thích.Trích dẫn từ tài liệu của chức năng đó:

... + 0123.45e6 là một giá trị số hợp lệ ...

0
<?php 
$a = 453453445435.4; 

echo $bigint = floor($a); 
Các vấn đề liên quan