PHP में दशमलव से बेकार शून्य अंक निकालें


163

मैं zero decimalsइस तरह से संख्या मानों को हटाने का एक तेज़ तरीका खोजने की कोशिश कर रहा हूं :

echo cleanNumber('125.00');
// 125

echo cleanNumber('966.70');
// 966.7

echo cleanNumber(844.011);
// 844.011

क्या ऐसा करने के लिए कुछ अनुकूलित तरीका मौजूद है?


4
जैसा कि आपके मूल्य वास्तव में तार हैं, तो बस '0.' के साथ rtrim () - php.net/manual/en/function.rtrim.php - का उपयोग क्यों नहीं करें दूसरे तर्क के रूप में
मार्क बेकर

क्षमा करें, मैं पूरी तरह से स्पष्ट नहीं हूं, वे हमेशा तार नहीं होते हैं, मैं प्रश्न को ठीक करता हूं।
विट्ठो

9
@ मर्क बेकर: यह एक बुरा तरीका है क्योंकि संख्या 120 को 12 तक छंटनी होगी
machineaddict

@machineaddict - अगर यह, और केवल अगर, स्ट्रिंग मानों में दशमलव बिंदु नहीं होता है ..... तो ओपी द्वारा उद्धृत उन सभी में दशमलव बिंदु होता है।
मार्क बेकर

2
फिर आपको अपने उत्तर में एक बोल्ड नोटिस जोड़ना चाहिए, कि यह केवल तभी काम करता है जब दशमलव हो।
machineaddict

जवाबों:


354

$num + 0 उसने चाल चली।

echo 125.00 + 0; // 125
echo '125.00' + 0; // 125
echo 966.70 + 0; // 966.7

आंतरिक रूप से, इस के साथ फ्लोट करने के लिए कास्टिंग के बराबर है (float)$numया floatval($num)लेकिन मैं इसे सरल लगता है।


45
मुझे लगता है कि यह एक गंदी चाल है। मैं इसे पसंद नहीं करूंगा क्योंकि कोड उसके व्यवहार के बारे में नहीं बताता हैfloatval() वह कर रहा है।
ESCOBAR

4
@ESCOBAR floatvalका व्यवहार एक फ्लोट लौटा रहा है। मैं इसे एक दशमलव सूत्र के रूप में उपयोग करने का तर्क दूंगा या तो बहुत स्पष्ट या साफ नहीं है।
लाफोर

2
यह बहुत अस्पष्ट है। हमारी टीम ने हमारे कोड में केवल इसका सामना किया, और इसमें कुछ समय के लिए 3 डेवलपर्स हैरान थे। मुझे लगता है कि मार्क का जवाब एक बेहतर विकल्प है। यह लंबा है, लेकिन इसकी मंशा स्पष्ट है।
jfbalanc

2
@jfbalanc//COMMENT
वेबिनान

1
@ESCOBAR वास्तव में नहीं है, यह टाइपकास्टिंग के लिए आधिकारिक तौर पर सुझाई गई विधि है ... php.net पर "टाइप
जुगाड़

101

आप बस floatvalफ़ंक्शन का उपयोग कर सकते हैं

echo floatval('125.00');
// 125

echo floatval('966.70');
// 966.7

echo floatval('844.011');
// 844.011

2
यह तब विफल हो जाता है जब हजार विभाजक एक बिंदु है और दशमलव चिह्न एक अल्पविराम है।
मुन्ना खान

20

यही है वह जो मेरे द्वारा उपयोग किया जाता है:

function TrimTrailingZeroes($nbr) {
    return strpos($nbr,'.')!==false ? rtrim(rtrim($nbr,'0'),'.') : $nbr;
}

NB यह मान लिया .जाता है कि दशमलव विभाजक है। इसका लाभ यह है कि यह मनमाने ढंग से बड़े (या छोटे) नंबरों पर काम करेगा क्योंकि फ्लोट कास्ट नहीं है। यह संख्या को वैज्ञानिक संकेतन (जैसे 1.0E-17) में भी नहीं बदलेगा।


यह एक सुरक्षित समाधान नहीं है, क्या होगा अगर कीमत दशमलव नहीं है? उदाहरण के लिए यदि डेवलपर एक पूर्णांक के साथ कीमत को गुणा करता है तो हमारे पास एक पूर्णांक है
amin

@alex यह फ़ंक्शन पूर्णांक, फ़्लोट और स्ट्रिंग्स पर काम करता है।
मपेन

1
Bcmath के लिए सहायक के रूप में सही समाधान
Kart Av1k

17

बस +अपने स्ट्रिंग वेरिएबल में जोड़ने से टाइपकास्ट (फ्लोट) हो जाएगा और शून्य हटा देगा:

var_dump(+'125.00');     // double(125)
var_dump(+'966.70');     // double(966.7)
var_dump(+'844.011');    // double(844.011)
var_dump(+'844.011asdf');// double(844.011)

13

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

$num = number_format($value, 1, ',', '');

सेवा:

$num = str_replace(',0', '', number_format($value, 1, ',', '')); // e.g. 100,0 becomes 100


यदि दो शून्य हटाए जाने हैं, तो निम्न में बदलें:

$num = str_replace(',00', '', number_format($value, 2, ',', '')); // e.g. 100,00 becomes 100

यहाँ और अधिक: PHP संख्या: दशमलव बिंदु केवल अगर आवश्यक दिखाई दे


10

यदि आप पृष्ठ या टेम्प्लेट पर प्रदर्शित होने से ठीक पहले शून्य अंक निकालना चाहते हैं।

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

sprintf('%g','125.00');
//125

‌‌sprintf('%g','966.70');
//966.7

‌‌‌‌sprintf('%g',844.011);
//844.011

धन्यवाद मुझे यह जवाब पसंद आया। यह मेरे लिए बहुत मददगार है।
सुमित कुमार गुप्ता

9

आपको अपना नंबर फ्लोट के रूप में डालना चाहिए, जो आपके लिए ऐसा करेगा।

$string = "42.422005000000000000000000000000";
echo (float)$string;

इसका आउटपुट वही होगा जो आप खोज रहे हैं।

42.422005


1
फ्लोट कास्टिंग आपके नंबर को दूषित भी कर सकती है। जैसे (float)'0.1234567890124567890123456789'बन जाता है 0.12345678901246
मपेन

8
$x = '100.10'; 
$x = preg_replace("/\.?0*$/",'',$x); 
echo $x;

ऐसा कुछ भी नहीं है जिसे एक साधारण रेगेक्स के साथ तय नहीं किया जा सकता है;)

http://xkcd.com/208/


1
स्ट्रिप्स बंद महत्वपूर्ण 0s जैसे में "100"। इसके अलावा 0एस बंद करने में विफल रहता है "100.010"
मपेन

2
सब लोग पीछे खड़े हो जाओ! $x = preg_replace("/(\.0*$)|((?<=\.\d*)0+$)/",'',$x);
इमानुएल एस।


2

इस सवाल के कारण पुराना है। सबसे पहले, मुझे इस बारे में खेद है।

प्रश्न संख्या xxx.xx के बारे में है लेकिन अगर यह x, xxx.xxxxx या अंतर दशमलव विभाजक जैसे xxxx, xxxx है तो यह दशमलव मान से शून्य अंकों को खोजने और निकालने के लिए कठिन हो सकता है।

/**
 * Remove zero digits from decimal value.
 * 
 * @param string|int|float $number The number can be any format, any where use in the world such as 123, 1,234.56, 1234.56789, 12.345,67, -98,765.43
 * @param string The decimal separator. You have to set this parameter to exactly what it is. For example: in Europe it is mostly use "," instead of ".".
 * @return string Return removed zero digits from decimal value.
 */
function removeZeroDigitsFromDecimal($number, $decimal_sep = '.')
{
    $explode_num = explode($decimal_sep, $number);
    if (is_array($explode_num) && isset($explode_num[count($explode_num)-1]) && intval($explode_num[count($explode_num)-1]) === 0) {
        unset($explode_num[count($explode_num)-1]);
        $number = implode($decimal_sep, $explode_num);
    }
    unset($explode_num);
    return (string) $number;
}

और यहाँ परीक्षण के लिए कोड है।

$numbers = [
    1234,// 1234
    -1234,// -1234
    '12,345.67890',// 12,345.67890
    '-12,345,678.901234',// -12,345,678.901234
    '12345.000000',// 12345
    '-12345.000000',// -12345
    '12,345.000000',// 12,345
    '-12,345.000000000',// -12,345
];
foreach ($numbers as $number) {
    var_dump(removeZeroDigitsFromDecimal($number));
}


echo '<hr>'."\n\n\n";


$numbers = [
    1234,// 12324
    -1234,// -1234
    '12.345,67890',// 12.345,67890
    '-12.345.678,901234',// -12.345.678,901234
    '12345,000000',// 12345
    '-12345,000000',// -12345
    '12.345,000000',// 12.345
    '-12.345,000000000',// -12.345
    '-12.345,000000,000',// -12.345,000000 STRANGE!! but also work.
];
foreach ($numbers as $number) {
    var_dump(removeZeroDigitsFromDecimal($number, ','));
}

2

+0 जोड़ने के साथ सावधान रहें।

echo number_format(1500.00, 2,".",",")+0;
//1

इसका परिणाम 1 है।

echo floatval('1,000.00');
// 1

echo floatval('1000.00');
//1000

आप 2013 से एक प्रश्न का उत्तर दे रहे हैं।
VTodorov

3
यह एक पुराने प्रश्न का उत्तर देने के लिए समस्या नहीं है, अगर यह वास्तविक पाठकों की मदद कर सकता है
शासनकाल .85

1

अजीब बात है, जब मुझे "फ्लोट" प्रकार के साथ डेटाबेस से नंबर मिलता है और यदि मेरा नंबर पूर्व है। 10000 जब मैं इसे तैरता हूं, तो यह 1 हो जाता है।

$number = $ad['price_month']; // 1000 from the database with a float type
echo floatval($number);
Result : 1

मैंने ऊपर दिए गए सभी समाधानों का परीक्षण किया है, लेकिन काम नहीं किया।


1
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7

0

जटिल तरीका लेकिन काम करता है:

$num = '125.0100';
$index = $num[strlen($num)-1];
$i = strlen($num)-1;
while($index == '0') {
   if ($num[$i] == '0') {
     $num[$i] = '';
     $i--;
   }

   $index = $num[$i];
}

//remove dot if no numbers exist after dot
$explode = explode('.', $num);
if (isset($explode[1]) && intval($explode[1]) <= 0) {
   $num = intval($explode[0]);
}

echo $num; //125.01

ऊपर दिए गए समाधान इष्टतम तरीका है, लेकिन यदि आप अपना स्वयं का उपयोग करना चाहते हैं तो आप इसका उपयोग कर सकते हैं। यह एल्गोरिथ्म स्ट्रिंग के अंत में क्या शुरू करता है और इसकी जाँच करता है कि क्या इसकी 0 , यदि यह खाली स्ट्रिंग पर सेट है और फिर पिछले वर्ण से अगले वर्ण पर जाता है तो अंतिम वर्ण है > 0



0

मेरे छोटे समाधान Thats ... एक वर्ग और सेट vars शामिल कर सकते हैं

निजी $ dsepparator = '।'; // दशमलव $ $ tsepparator = ','; // हजार

यह कंस्ट्रक्टर द्वारा सेट किया जा सकता है और उपयोगकर्ताओं को बदल सकता है।

class foo
{
    private $dsepparator;
    private $tsepparator;

    function __construct(){
        $langDatas = ['en' => ['dsepparator' => '.', 'tsepparator' => ','], 'de' => ['dsepparator' => ',', 'tsepparator' => '.']];
        $usersLang = 'de'; // set iso code of lang from user
        $this->dsepparator = $langDatas[$usersLang]['dsepparator'];
        $this->tsepparator = $langDatas[$usersLang]['tsepparator'];
    }

    public function numberOmat($amount, $decimals = 2, $hideByZero = false)
    {
        return ( $hideByZero === true AND ($amount-floor($amount)) <= 0 ) ? number_format($amount, 0, $this->dsepparator, $this->tsepparator) : number_format($amount, $decimals, $this->dsepparator, $this->tsepparator);
    }
    /*
     * $bar = new foo();
     * $bar->numberOmat('5.1234', 2, true); // returns: 5,12
     * $bar->numberOmat('5', 2); // returns: 5,00
     * $bar->numberOmat('5.00', 2, true); // returns: 5
     */

}

इसलिए मैंने छोटे नमूनों के साथ एक नमूना वर्ग बनाया है। बेहतर? =)
Paykoman

0

यह मेरा समाधान है। मैं हजारों विभाजक जोड़ने की क्षमता रखना चाहता हूं

    $precision = 5;    
    $number = round($number, $precision);
    $decimals = strlen(substr(strrchr($number, '.'), 1));
    return number_format($number, $precision, '.', ',');

0

यह rtrim, विभाजक और दशमलव बिंदु को बचाने के लिए एक सरल एक लाइन फ़ंक्शन है:

function myFormat($num,$dec)
 {
 return rtrim(rtrim(number_format($num,$dec),'0'),'.');
 }

0

मैंने पाया कि यह समाधान सबसे अच्छा है:

public function priceFormat(float $price): string
{
    //https://stackoverflow.com/a/14531760/5884988
    $price = $price + 0;
    $split = explode('.', $price);
    return number_format($price, isset($split[1]) ? strlen($split[1]) : 2, ',', '.');
}

0

सरल और सटीक!

function cleanNumber($num){
    $explode = explode('.', $num);
    $count   = strlen(rtrim($explode[1],'0'));
    return bcmul("$num",'1', $count);
}

0

अंतिम समाधान: regex का उपयोग करने का एकमात्र सुरक्षित तरीका है:

echo preg_replace("/\.?0+$/", "", 3.0); // 3
echo preg_replace("/\d+\.?\d*(\.?0+)/", "", 3.0); // 3

यह किसी भी मामले के लिए काम करेगा



-1
$value = preg_replace('~\.0+$~','',$value);

1
यह आपके उत्तर की गुणवत्ता में सुधार करेगा यदि आपने यह समझा दिया कि आपका कोड क्या करता है और यह मूल प्रश्न को कैसे हल करेगा।
निगेल रेन

@ निखिल ज्ञान मैं मानता हूं कि यह जवाब बहुत अच्छा नहीं है। बेझिझक ओट नीचे। हालांकि, मुझे कम से कम यह नहीं लगता कि यह बहुत कम गुणवत्ता वाले झंडे के लिए बुरा है
सैम हार्टमैन

-2

यह कोड बिंदु के बाद शून्य को हटा देगा और केवल दो दशमलव अंक लौटाएगा।

$ नंबर 1200.0000 =;
str_replace ('00', '', number_format ($ संख्या, 2, '', ''));

आउटपुट होगा: 1200

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