दो दशमलव स्थानों के लिए एक संख्या दिखाएं


569

PHP स्ट्रिंग को दो दशमलव स्थानों पर गोल करने का सही तरीका क्या है?

$number = "520"; // It's a string from a database

$formatted_number = round_to_2dp($number);

echo $formatted_number;

आउटपुट होना चाहिए 520.00;

round_to_2dp()फ़ंक्शन की परिभाषा कैसे होनी चाहिए ?


13
यह वास्तव में "गोलाई" नहीं है। गोलाई से शुद्धता कम हो जाती है। यह दशमलव स्थानों को ऐसी संख्या में नहीं जोड़ेगा जो उनके पास नहीं है। कई उत्तरों और टिप्पणियों के आधार पर, ऐसा लगता है कि लोग सोच रहे हैं कि गोलाई कुछ ऐसा नहीं है। roundएक गणित कार्य है, और यह सिर्फ एक प्रारूपण समस्या है।
पैनिक

जवाबों:


1130

आप number_format () का उपयोग कर सकते हैं :

return number_format((float)$number, 2, '.', '');

उदाहरण:

$foo = "105";
echo number_format((float)$foo, 2, '.', '');  // Outputs -> 105.00

यह फ़ंक्शन एक स्ट्रिंग लौटाता है ।


4
राउंड () यह पठनीयता और सादगी के लिए भी बेहतर होगा, लेकिन कुछ भी महत्वपूर्ण होने के लिए ध्यान रखें कि इसे छोटी गाड़ी के रूप में जाना जाता है
स्ट्रिंग्सऑनफेयर

40
@ ThelvaroG.Vicario roundयहाँ ओपी की समस्या का समाधान नहीं करता है। round("520", 2)फ्लोट लौटाता है 520, और गूँजता है जो निश्चित रूप से इसे 2 दशमलव स्थानों पर नहीं दिखाएगा। ओपी के उद्देश्य के लिए - अनुगामी शून्य के साथ इसे लगाकर 2 दशमलव स्थानों पर पूर्णांक दिखाना - आपको एक संख्या स्वरूपण फ़ंक्शन की आवश्यकता है, एक राउंडिंग फ़ंक्शन नहीं।
मार्क अमेरी

3
अन्य सभी उत्तर एक दशमलव संकेतन के साथ दशमलव मानों तक सीमित हैं। जब आपको 520,00इसके बजाय प्राप्त करने की आवश्यकता होती है 520.00, तो यह बस काम करता है।
एसपीआरबीआरएन

1
अगर आप केवल फ्लोट को सीमित करना चाहते हैं, लेकिन int नहीं तो bcdiv ($ नंबर, 1,2)
वसीम ए।

2
मुझे लगता है कि आपको bcadd (0, $ yournumber, 2) का उपयोग करना चाहिए, यह आपको सही परिणाम देगा।
जौहुक

213

उपयोग round()(उपयोग करें यदि आप फ्लोट प्रारूप में केवल एक संख्या की उम्मीद कर रहे हैं, तो कोड_फॉर्मैट () कोडमवनी द्वारा दिए गए उत्तर के रूप में उपयोग करें ):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520

मैनुअल से:

विवरण:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);

valनिर्दिष्ट precision(दशमलव बिंदु के बाद अंकों की संख्या) के गोल मान को लौटाता है । precisionनकारात्मक या शून्य (डिफ़ॉल्ट) भी हो सकता है।

...

उदाहरण # 1 round()उदाहरण

<?php
    echo round(3.4);         // 3
    echo round(3.5);         // 4
    echo round(3.6);         // 4
    echo round(3.6, 0);      // 4
    echo round(1.95583, 2);  // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2);    // 5.05
    echo round(5.055, 2);    // 5.06
?>

उदाहरण # 2 मोड उदाहरण

<?php
    echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
    echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
    echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
    echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

    echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
    echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9
?>

5
@khuderm round($number, 2);काम नहीं करता है। मुझे 520.00 नहीं 520 चाहिए। विश्वास नहीं कर सकता कि डिफ़ॉल्ट रूप से गोल नहीं है।
क्लॉडिउ क्रेगना

2
यह भी ठीक से ओपी का जवाब नहीं है, लेकिन 100 से अधिक वोट है!
रोब सेडविकविक

200

वैकल्पिक रूप से,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00

3
तो क्या हुआ अगर आप चाहते हैं 520,00? मुझे लगता है कि उस मामले में अन्य जवाब बेहतर काम करता है।
SPRBRN

2
^ कोई अन्य उत्तर इंट के लिए दो दशमलव स्थान नहीं देगा
pythonian29033

1
अन्य कारणों से आप यह चाहते हो सकता है कि क्या आप गोलाई नहीं चाहते ... या मेरे कारण एसक्यूएल फ़्लोट्स को सामान्य फ़्लोट्स के समान नहीं माना जाता है जो कि PHP गणित बग है
Amb3rL4nn

34

http://php.net/manual/en/function.round.php

जैसे

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

राउंड उस सटीक कार्यक्षमता को करेगा जो रिच चाहता है, लेकिन सभी प्रकार के संख्यात्मक स्वरूपण के लिए देखने के लिए नंबर_फॉर्मैट () अधिक दिलचस्प होगा।
शमीम हाफिज

यह विधि केवल अंकों को ".00" के अंत में मजबूर करने के साथ-साथ राउंडिंग भी करेगी।
SystemX17

10
मैं दौर की कोशिश की, लेकिन यह काम नहीं करता है - यह अतिरिक्त जोड़ नहीं होगा .00
रिच ब्रैडशॉ

मेरे पास जो एक उदाहरण है, उसका उपयोग करने की कोशिश करें, यह एक PHP स्क्रिप्ट में स्वयं पर है। आपको टिप्पणी परिणाम प्राप्त करना चाहिए। यदि नहीं तो आपको कहीं न कहीं अपने PHP सेटअप में समस्या है।
SystemX17

1
दौर (520, 2) रिटर्न 520, नहीं 520.00 के रूप में @Rich के लिए आवश्यक
user761100

25

प्रयत्न:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 

उत्पादन होगा:

1,234,545,454.00

2
यह काम करता है, लेकिन आउटपुट एक स्ट्रिंग होगा और एक संख्या नहीं होगी।
ईथन

1
यदि आप number_format का उपयोग करना चाहते हैं तो कम से कम इसे number_format ($ number, 2, '।', '')
Mihai P.

14

आप PHP का उपयोग कर सकते हैं printfयाsprintf कार्यों का :

उदाहरण के साथ sprintf:

$num = 2.12;
echo sprintf("%.3f", $num);

आप इसे बिना चला सकते हैं echo । उदाहरण:sprintf("%.3f", $num);

आउटपुट:

2.120

वैकल्पिक रूप से, साथ printf:

echo printf("%.2f", $num);

आउटपुट:

2.124

12

इस मुद्दे को हल करने के लिए एक और अधिक विदेशी तरीका bcadd()$ right_operand के लिए एक डमी मूल्य के साथ उपयोग करना है 0

$formatted_number = bcadd($number, 0, 2);

2
ध्यान दें कि bc*फ़ंक्शन गोल नहीं होते हैं, वे हमेशा गोल होते हैं। उदाहरण के लिए, bcadd("1.0999","0.0",1)"1.0" पैदावार, "1.1" नहीं।
कॉलिनम

1
बीसी गणित के कार्य वास्तव में केवल $scaleआंशिक अंकों पर प्रसंस्करण बंद कर देते हैं । यह शून्य की ओर गोलाई लिए हुए है।
अली



7

round_to_2dp एक उपयोगकर्ता-परिभाषित फ़ंक्शन है, और जब तक आप उस फ़ंक्शन की घोषणा को पोस्ट नहीं करते तब तक कुछ भी नहीं किया जा सकता है।

हालाँकि, मेरा अनुमान यह है: number_format($number, 2);


14
आपके पहले पैराग्राफ से, मुझे लगता है कि आपने प्रश्न को गलत समझा है। round_to_2dp($number);स्यूडोकोड के रूप में था; ओपी किसी से पूछ रहा था कि उसे बताएं कि उस अभिव्यक्ति को किसके साथ बदलना है।
मार्क अमेरी

7
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

यह दशमलव बिंदु के ठीक बाद दो अंक प्रदर्शित करेगा।

लाभ:

यदि आप एक फ्लोट मान के बाद दो अंक प्रदर्शित करना चाहते हैं और इंट के लिए नहीं, तो इसका उपयोग करें।


यह सबसे सार्वभौमिक समाधान है यदि आपके पास bcdiv है (यह सेंटोस 6 पर एक स्टॉक लेकिन गैर-डिफ़ॉल्ट पैकेज है)।
शोवस

6
$twoDecNum = sprintf('%0.2f', round($number, 2));

राउंडिंग सही ढंग से संख्या को गोल करता है और स्प्रिंटफ इसे 2 दशमलव स्थानों पर बाध्य करता है यदि ऐसा होता है तो राउंडिंग के बाद केवल 1 दशमलव स्थान होता है।


6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

यह संख्या को गोल किए बिना 5.98 पर वापस आ जाएगी।


केवल यह भी काम कर सकते हैं floor($retailPrice * 100) / 100;नंबर की जरूरत नहीं तो प्रारूप।
किसी दिन

6

सशर्त बंद के लिए यानी। दशमलव को दिखाएँ जहाँ इसकी वास्तव में आवश्यकता है अन्यथा पूरी संख्या

123.56 => 12.56

123.00 => 123

$somenumber = 123.56;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123.56


$somenumber = 123.00;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123    

6

मैं अपना बनाता हूं।

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);

1
यह करने के लिए आवश्यक गणित के कुछ देखने के लिए अच्छा है। हालांकि एक अंतर्निहित फ़ंक्शन का उपयोग करना मेरे लिए पसंद किया जाता है। Theres कोई बिंदु फिर से पहिया का आविष्कार नहीं है।
लाइटबल्ब 1

1
क्षमा करें, लेकिन राउंड (), जैसा कि यह कहता है, राउंड डी नंबर, और कभी-कभी, मैं राउंड नहीं करना चाहता।
joanlgr

5

यहाँ मुझे .एक फ़ंक्शन का उपयोग करके (डॉट) के बाद दो दशमलव प्राप्त होते हैं ...

function truncate_number($number, $precision = 2) {

    // Zero causes issues, and no need to truncate
    if (0 == (int)$number) {
        return $number;
    }

    // Are we negative?
    $negative = $number / abs($number);

    // Cast the number to a positive to solve rounding
    $number = abs($number);

    // Calculate precision number for dividing / multiplying
    $precision = pow(10, $precision);

    // Run the math, re-applying the negative value to ensure
    // returns correctly negative / positive
    return floor( $number * $precision ) / $precision * $negative;
}

उपरोक्त फ़ंक्शन से परिणाम:

echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789);    // 2.56
echo truncate_number(2.56789, 3); // 2.567

echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789);    // -2.56
echo truncate_number(-2.56789, 3); // -2.567

नया सही उत्तर

PHP देशी फंक्शन bcdiv का प्रयोग करें

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 2);  // 2.56
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567

4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

यह आपको दशमलव के बाद 2 नंबर देगा।


4
नहीं, यह नहीं होगा। मुझे नहीं पता कि यह पोस्ट कब लिखी गई थी, लेकिन अगर आप इसे अपने उदाहरण से आज़माते हैं, तो कम से कम मेरी मशीन :-) पर, यह 520.90 का उत्पादन करेगी। मतलब, गोलाई होगी। सावधान रहे!
बोअज राइमलैंड

4

यदि आप अपनी संपूर्ण परियोजना में दो दशमलव अंकों का उपयोग करना चाहते हैं, तो आप परिभाषित कर सकते हैं:

bcscale(2);

तब निम्न फ़ंक्शन आपके वांछित परिणाम का उत्पादन करेगा:

$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11

लेकिन यदि आप bcscale फ़ंक्शन का उपयोग नहीं करते हैं, तो आपको अपना वांछित परिणाम प्राप्त करने के लिए कोड निम्नानुसार लिखना होगा।

$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11

अधिक जानने के लिए




0

अन्य उत्तरों में जोड़ना, चूंकि नंबर_फॉर्मैट () डिफ़ॉल्ट रूप से, हजारों विभाजक जोड़ देगा।

इसे हटाने के लिए, यह करें:

$number = number_format($number, 2, ".", "");

0
  • दशमलव की संख्या चुनें
  • प्रारूप अल्पविराम (,)
  • अनुगामी शून्य को ट्रिम करने का विकल्प

हमेशा के लिये!

function format_number($number,$dec=0,$trim=false){
  if($trim){
    $parts = explode(".",(round($number,$dec) * 1));
    $dec = isset($parts[1]) ? strlen($parts[1]) : 0;
  }
  $formatted = number_format($number,$dec); 
  return $formatted;
}

उदाहरण

echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2);      //returns 1,234.50
echo format_number(1234.5);        //returns 1,235

-5

आप PHP राउंड () फ़ंक्शन का उपयोग कर सकते हैं ।

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06

3
-1; इस उत्तर में कुछ भी नया नहीं है कि सोमनाथ मुलुक के उत्तर में 2 साल पहले से ही नहीं था।
मार्क अमेरी

1
यह भी गलत है, जैसा कि सोमनाथ के उत्तर पर मेरी टिप्पणी में दिया गया है।
मार्क अमेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.