পিএইচপি-র দশমিক থেকে অকেজো শূন্য অঙ্কগুলি সরান


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
মেশিনড্যাডিক্ট

@ মেশিনেডিক্টিক্ট - এটি যদি এবং কেবলমাত্র স্ট্রিং মানগুলির দশমিক বিন্দু না থাকত ..... ওপি দ্বারা উদ্ধৃত সমস্তগুলি দশমিক পয়েন্ট থাকে।
মার্ক বাকের

2
তারপরে আপনার উত্তরে আপনার একটি সাহসী নোটিশ যুক্ত করা উচিত, যে কেবলমাত্র দশমিক হয় তবে এটি কাজ করে।
মেশিনাদিক্ট

উত্তর:


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()বলে না যে এটি করা হচ্ছে।
ইসকোবার

4
@ ইসকোবারের floatvalআচরণটি ভেসে উঠছে । আমি যুক্তি দিয়েছি যে এটি একটি দশমিক দশকের বিন্যাস হিসাবে ব্যবহার করা খুব সুস্পষ্ট বা পরিষ্কার নয়।

2
এটা খুব অস্পষ্ট। আমাদের টিমটি সবেমাত্র আমাদের কোডে এটির মুখোমুখি হয়েছিল এবং এতে 3 বিকাশকারী কিছু সময়ের জন্য বিস্মিত হয়েছিল। আমি মনে করি মার্কের উত্তরটি আরও ভাল বিকল্প। এটি দীর্ঘ, তবে এর উদ্দেশ্য পরিষ্কার।
jfbalanc

2
@jfbalanc//COMMENT
ওয়েবিনান

1
@ ইসকোবার সত্যই নয়, এটি টাইপকাস্টিংয়ের জন্য আনুষ্ঠানিকভাবে প্রস্তাবিত একটি পদ্ধতি ...
পিএইচপিএনটিতে

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;
}

এনবি এটি অনুমান করে .যে দশমিক বিভাজক। এটির সুবিধা রয়েছে যে এটি কোনও ফ্লোট কাস্ট না থাকায় নির্বিচারে বৃহত (বা ছোট) সংখ্যায় কাজ করবে। এটি সংখ্যাগুলি বৈজ্ঞানিক স্বরলিপিতে রূপান্তরিত করবে না (উদাহরণস্বরূপ 1.0E-17)।


এটি কোনও নিরাপদ সমাধান নয়, দাম দশমিক না হলে কী হবে? উদাহরণস্বরূপ যদি বিকাশকারী একটি পূর্ণসংখ্যার সাথে দামটি গুণ করে তবে আমাদের একটি পূর্ণসংখ্যা রয়েছে
am

@alex এই ফাংশনটি পূর্ণসংখ্যা, ভাসমান এবং স্ট্রিংয়ের উপর কাজ করে।
এমপেন

1
বিসিএমথের সহায়ক হিসাবে নিখুঁত সমাধান
কার্ট এভ

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

এখানে আরও: পিএইচপি নম্বর: দশমিক পয়েন্ট কেবলমাত্র প্রয়োজন হলে দৃশ্যমান


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
0যেমন হিসাবে উল্লেখযোগ্য গুলি স্ট্রিপস "100"। এছাড়াও স্ট্রিপ 0বন্ধ করতে ব্যর্থ "100.010"
এমপেন

2
সবাই পিছনে দাঁড়িয়ে! $x = preg_replace("/(\.0*$)|((?<=\.\d*)0+$)/",'',$x);
ইমানুয়েল এস


2

এই প্রশ্নটি কারণে পুরানো। প্রথমত, আমি এই সম্পর্কে দুঃখিত।

প্রশ্নটি এক্সএক্সএক্সএক্সএক্সএক্স.এই ক্ষেত্রে তবে এটি যদি এক্স, এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স বা এক্সএক্সএক্সএক্সএক্স এর মতো পার্থক্য দশমিক বিভাজক হয় তবে দশমিক মান থেকে শূন্য অঙ্কগুলি সন্ধান করা এবং অপসারণ করা আরও কঠিন হতে পারে।

/**
 * 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

আপনি ২০১৩ সাল থেকে একটি প্রশ্নের উত্তর
দিচ্ছেন

3
কোনও পুরানো প্রশ্নের উত্তর দেওয়া কোনও সমস্যা নয়, যদি এটি প্রকৃত পাঠকদের সহায়তা করতে পারে
Reign.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

আমার ছোট সমাধানটি চালিয়ে যায় ... ক্লাসে অন্তর্ভুক্ত করা যায় এবং ভারসেট সেট করা যায়

ব্যক্তিগত se dsepparator = ''; // দশমিক প্রাইভেট se 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
     */

}

সুতরাং আমি সামান্য নমুনা সহ একটি নমুনা শ্রেণি তৈরি করেছি। উত্তম? =)
পেকোমান

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

চূড়ান্ত সমাধান: একমাত্র নিরাপদ উপায় হ'ল রেজেক্স ব্যবহার করা:

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', '', সংখ্যা_ ফর্ম্যাট ($ সংখ্যা, 2, '।', ''));

আউটপুট হবে: 1200

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.