2009-06-13 10 views
23

PHP 5 में, जब भी मुझे इनपुट के रूप में संख्या मिलती है तो मैं अंतराल() का उपयोग करता हूं। इस तरह, मैं यह सुनिश्चित करना चाहता हूं कि मुझे कोई स्ट्रिंग या फ़्लोटिंग नंबर न मिले। मेरी इनपुट संख्या पूरी संख्या में होनी चाहिए। लेकिन जब मुझे संख्याएं मिलती हैं> = 2147483647, हस्ताक्षरित पूर्णांक सीमा पार हो जाती है।PHP: अंतराल() संख्याओं के बराबर> = 2147483647

सभी आकारों में संख्याओं के लिए अंतराल() समकक्ष रखने के लिए मैं क्या कर सकता हूं?

यहाँ है कि मैं क्या करना चाहते है:

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

अग्रिम में बहुत बहुत धन्यवाद!

संपादित करें: कुछ उत्तरों के आधार पर, मैंने समकक्ष फ़ंक्शन को कोड करने का प्रयास किया है। लेकिन यह अभी तक अंतराल() अभी तक काम नहीं करता है। मैं इसे कैसे सुधार सकता हूँ? इसमें ग़लत क्या है?

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

तो क्या वास्तव में यह काम नहीं करता है और क्या अन्य समाधान के साथ गलत क्या है यहाँ, रेगेक्स एक सहित? –

उत्तर

20

इस फ़ंक्शन को आज़माएं, यह किसी भी दशमलव को अंतराल के रूप में ठीक से हटा देगा और किसी गैर-संख्यात्मक वर्णों को हटा देगा।

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

आशा है कि मदद करता है:

<?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 />"; 
?> 

यहाँ उत्पादित उत्पादन है!

+0

आपको बहुत धन्यवाद, यही वही है जो मैं ढूंढ रहा था। – caw

+2

नकारात्मक कार्य से निपटने पर यह कार्य संभावित रूप से हानिकारक है: जबकि 'अंतराल (-100) == -100', 'bigintval (-100) == 0'। – Ferenjito

2

या तो number_format($inputNumber, 0, '', '')

का उपयोग या यदि आप केवल अगर इसकी जाँच करना चाहते हैं एक पूर्ण संख्या तो का उपयोग ctype_digit($inputNumber)

प्रस्तावित is_numeric का उपयोग न करें, के रूप में भी तैरता सांख्यिक हैं। जैसे "+ 0123.45e6" द्वारा is_numeric

+0

फ्लोट अभी भी बह जाएगा। –

+0

फ्लोट ओवरफ्लो कोई फर्क नहीं पड़ता, इसलिए यह उपयोगी प्रतीत होता है। कृपया प्रश्न में मेरा संपादन देखें। – caw

2

स्वीकार कर लिया जाता है number_format के अलावा, आप sprintf का उपयोग कर सकते हैं:

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

हालांकि, दोनों समाधान, नाव अतिप्रवाह से ग्रस्त हैं, उदाहरण के लिए:

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

धन्यवाद! प्रश्न में मेरे संपादन पर एक नज़र डालें। क्या यह एक अच्छा समकक्ष समारोह है? – caw

+1

@ आर्टम: न केवल यह फ्लोट ओवरफ्लो से पीड़ित है, यह गोल भी करता है। sprintf ("%। 0f", 1.5) 2 देता है, जबकि अंतराल (1.5) रिटर्न 1. – mercator

6

आप इंटियल न्यूमेरिक पार्ट्स के बाद सबकुछ हटाने के लिए नियमित अभिव्यक्तियों का भी उपयोग कर सकते हैं:

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

मुझे लगता है कि आपके रेगेक्स में कोई त्रुटि है, आपका कोड कुछ भी आउटपुट नहीं करता है। – defines

+0

क्षमा करें। यह तय किया गया है। – SztupY

+0

धन्यवाद! :) आपका जवाब महत्वपूर्ण था क्योंकि डस्टिन फाइनआउट ने आपके regexp का उपयोग किया था ... – caw

0

यदि आप मनमाना-परिशुद्धता संख्याओं को संभालना चाहते हैं, तो आपको gmp एक्सटेंशन का उपयोग करने की आवश्यकता होगी। फ़ंक्शन gmp_init(), उदाहरण के लिए, एक स्ट्रिंग को एक gmp संसाधन ऑब्जेक्ट में परिवर्तित करता है। दोष यह है कि उस ऑब्जेक्ट को आगे संसाधित करने के लिए आपको उस एक्सटेंशन के अन्य कार्यों का उपयोग करना होगा। इसे एक स्ट्रिंग में वापस कनवर्ट करना उदाहरण के लिए gmp_strval() का उपयोग करके किया जाता है।

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

आप केवल कि स्ट्रिंग एक वैध संख्या का प्रतिनिधित्व कर रहा है सत्यापित करने और, स्वयं स्ट्रिंग उपयोग करें यदि आप मूल्य पर किसी भी आपरेशन करने के लिए इरादा नहीं है सकते हैं। यही कारण है कि एक नियमित अभिव्यक्ति का उपयोग किया जा सकता है:

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

एक अन्य विकल्प is_numeric() उपयोग करने के लिए है। लेकिन वह फ़ंक्शन आपको जितना संभव हो उससे अधिक रूपांतरण करता है।कि समारोह के डॉक्स से हवाला देते हुए:

... + 0123.45e6 मान्य संख्या मान है ...

संबंधित मुद्दे