একটি সংখ্যা থেকে তুচ্ছ পেছনের শূন্যগুলি সরান?


157

আমি কি এমন একটি স্ট্যান্ডার্ড এপিআই কল মিস করেছি যা একটি নম্বর থেকে পিছনে তুচ্ছ শূন্যগুলি সরিয়ে দেয়?

যাত্রা।

var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001

নাম্বার টু ফিক্সড () এবং নাম্বার টোপ্রিসিশন () আমি যা খুজছি তা বেশিরভাগ নয়।


6
উম 1.234000 === 1.234,।
গম্বো

5
হ্যাঁ, আপনি সতর্কতা অবলম্বন করলে (এক্স) এটি পিছনের জিরোগুলি ছাড়াই পপ আপ হয়ে যায়
জে কেরিচার্টজ

50
বেশ কয়েকটি ক্লায়েন্টের সাথে কাজ করার পরে, আমি সাক্ষ্য দিতে পারি যে 1.234000 === 1.234 থাকা সত্ত্বেও ক্লায়েন্টরা তাদের প্রয়োজন না হলে এই অতিরিক্ত শূন্যগুলি দেখতে চান না।
পরিচিতি

16
ব্যবহার করবেন parseFloat(n)?
মিঃ এলিয়েন

এটি ছিল সবচেয়ে সহজ সমাধান যা আমার জন্য সমস্ত প্রান্তের কেসগুলি কভার করেছিল, আপনাকে ধন্যবাদ মিঃআলিয়েন।
জেমস পেরিহ

উত্তর:


140

আপনি যদি এটিকে স্ট্রিংয়ে রূপান্তর করেন তবে এটি কোনও চলমান শূন্য প্রদর্শন করবে না, যা স্ট্রিং নয়, সংখ্যা হিসাবে তৈরি হওয়ার পরে প্রথম স্থানে ভেরিয়েবলের মধ্যে সংরক্ষণ করা হয় না।

var n = 1.245000
var noZeroes = n.toString() // "1.245" 

6
শূন্যগুলি ছিনিয়ে নেওয়ার জন্য আমি কিছু কোড পোস্ট করতে যাচ্ছিলাম তবে ড্যানিয়েলের সমাধানটি কার্যকর বলে মনে হচ্ছে। এমনকি এটি "1.2345000" এর মতো স্ট্রিংয়ের জন্যও কাজ করে। ("1.2345000" * 1)। স্ট্রিং (); // হয়ে যায় 1.2345
স্টিভেন

7
অবশ্যই, যদি আপনার ভার ইতিমধ্যে একটি স্ট্রিং হয় তবে আপনাকে প্রথমে এটি একটি সংখ্যায় রূপান্তর করতে হবে এবং তারপরে আবার ফিরে আসতে হবে
derekcohen

এটি দুর্দান্ত কাজ করেছে। আমার একই সমস্যা ছিল, ফ্লোটকে স্ট্রিংয়ে রূপান্তরিত করলাম এবং তারপরে এটিকে সঠিক বিন্যাসে ফিরিয়ে আনার জন্য পার্সফ্লোটটি কেবল পিছনের শূন্যগুলি ছাড়াই।
ম্যাট ওয়েস্ট

10
এটি সম্পূর্ণ সমাধান নয়। এটা আপনি কিছু ফ্লোটিং পয়েন্ট উপস্থাপনা ত্রুটি সহ পরিবর্তনশীল, মত আছে কাজ করে না: var n = 1.245000000000001(অভিমানী এটা ব্যবহারকারীকে প্রতিনিধিত্ব করা নগণ্য)
আভাসিত করা

7
এই জাতীয় সংখ্যার জন্য অপ্রত্যাশিত ফলাফল আনতে পারে: 123111111111111111111111111111112122222222222222222222222222222222222222222222222.00। স্ট্রিংয়ের উপস্থাপনাটি সূচকীয় বিন্যাসে হবে: 1.231111111111111e + 81
স্টাস মাকুতিন

226

আমার অনুরূপ উদাহরণ রয়েছে যেখানে আমি ব্যবহার করতে চেয়েছিলাম .toFixed() যেখানে প্রয়োজন সেখানে , তবে প্যাডিংটি যখন ছিল না তখন আমি চাইনি। তাই আমি টু ফিক্সডের সাথে মিল রেখে পার্সফ্লোট ব্যবহার করে শেষ করেছি।

প্যাডিং ছাড়া ফিক্সড ed

parseFloat(n.toFixed(4));

প্রায় একই জিনিসটি করে এমন আর একটি বিকল্প
এই উত্তরটি আপনার সিদ্ধান্তকে সহায়তা করতে পারে

Number(n.toFixed(4));

toFixedনম্বরটিকে নির্দিষ্ট দৈর্ঘ্যে গোল / প্যাড করবে, তবে এটিকে স্ট্রিংয়ে রূপান্তর করবে। এটিকে আবার একটি সংখ্যাসূচক প্রান্তে রূপান্তরকরণটি কেবল অঙ্কটি গাণিতিকভাবে ব্যবহার করা নিরাপদ করে না, তবে স্বয়ংক্রিয়ভাবে যে কোনও 0 এর নম্বরও ড্রপ করে। উদাহরণ স্বরূপ:

var n = "1.234000";
    n = parseFloat(n);
 // n is 1.234 and in number form

কারণ আপনি যদি অনুসরণযোগ্য শূন্যগুলির সাথে একটি সংখ্যা নির্ধারণ করেন তবে সেগুলি বাদ পড়েছে।

var n = 1.23000;
 // n == 1.23;

দ্রষ্টব্য যে কেবলমাত্র দশমিকের প্রাসঙ্গিক সংখ্যা toFixed আর্গুমেন্টের তুলনায় সমান বা তার বেশি হলে এটি কাজ করে। সংখ্যাটি উদাহরণস্বরূপ যদি 1.200000 হয় তবে ফিক্সড (3) এর ফলাফল হবে 1.200 এবং এইভাবে, সমস্ত পিছনে থাকা শূন্যগুলি সরানো হবে না।
লিওপোলোডো সান্জিক

@ লিওপল্ডো সানজ্যাক না, আপনি কেবলমাত্র ফিক্সড ব্যবহার করছেন তবেই এটি সত্য, কারণ এটি একটি স্ট্রিং দেয়। সংখ্যার প্রকারগুলি স্বয়ংক্রিয়ভাবে পিছনের শূন্যগুলি হারাবে। সে কারণেই আমি দু'জনকে টেন্ডামে ব্যবহার করেছি।
গ্যারি

@ গ্যারি, আমি আমার মন্তব্য প্রত্যাহার করছি, parseFloat(n).toFixed(4);আপনার প্রকৃত উত্তরের পরিবর্তে আমি দেখেছি । আমি দুঃখিত.
লিওপোলোডো সান্জিক

2
না কেন +(n.toFixed(4))?
Константин Ван

3
upvoted! আপনার উত্তর 0.00000005 এর সাথে একটি মাত্র সমস্যা 5e-8 তে রূপান্তরিত হয় আমি কীভাবে এই সমস্যা ছাড়াই তুচ্ছ শূন্যগুলি সরিয়ে ফেলতে পারি, আমি 0.000058000 এর মতো ছোট সংখ্যার সাথে কাজ করছি যেখানে শেষে শূন্যগুলি অপসারণ করা দরকার
পাইরেটএপ

29

আমি প্রথম ম্যাটি-লাইরা এবং গ্যারি এর উত্তরগুলির সংমিশ্রণটি ব্যবহার করেছি:

r=(+n).toFixed(4).replace(/\.0+$/,'')

ফলাফল:

  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0.0012234: "0.0012"
  • 0.1200234: "0.12"
  • 0.000001231: "0"
  • 0.10001: "0.1000"
  • "এসএসডিএফ": "নাএন" (তাই কোনও রানটাইম ত্রুটি নেই)

কিছুটা সমস্যাযুক্ত সমস্যা 0.10001। আমি এই দীর্ঘ সংস্করণ ব্যবহার করে শেষ করেছি:

    r = (+n).toFixed(4);
    if (r.match(/\./)) {
      r = r.replace(/\.?0+$/, '');
    }
  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0.0012234: "0.0012"
  • 0.1200234: "0.12"
  • 0.000001231: "0"
  • 0.10001: "0.1"
  • "এসএসডিএফ": "নাএন" (তাই কোনও রানটাইম ত্রুটি নেই)

আপডেট : এবং এটি গ্যরির নতুন সংস্করণ (মন্তব্য দেখুন):

r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')

এটি উপরের মতো একই ফলাফল দেয়।


1
আমি একটি খাঁটি রেইগেক্স সমাধান পেয়েছি যা আমি বিশ্বাস করি যে কাজ করেtoFixed(4).replace(/([0-9]+(\.[1-9]+)?)(\.?0+$)/,"$1")
গ্যারি

1
গাহ! স্পষ্টতই আমি অন্যের তুলনায় আমার নিজের রেগেক্সগুলি ভাঙতে মোটামুটি ভাল নই। আমি এই মারতে দেব না! আমি আপনার পরীক্ষার সমস্ত মামলার বিরুদ্ধে এটি চালিয়েছি এবং যে কোনও (বৈধ) এর জন্য আমি ভাবতে পারি([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)
গ্যারি

1
রেজেক্স হল লোভী এবং কখনও কখনও পূর্ণসংখ্যার অংশ থেকে একটি "0" সরিয়ে দেয়! :-( কেন শুধু নয় replace(/[,.][1-9]+(0+)/,'')?
সেবাস্তিয়ান সেবল্ড

1
আন্ডাররেটেড উত্তর এটি।
চার্লি

1
@ w00t ওহ, দুঃখিত, আমি এখন বুঝতে পারি। আমার তৈরি করার সময় আমি যেভাবে পরীক্ষিত হয়েছিলাম (উপরের লিঙ্কটি দেখুন)। আপনি যখন ফিক্সড ব্যবহার করবেন তখন আপনার ব্যর্থ হবে না, কারণ নম্বরটি একটি বিন্দু থাকার গ্যারান্টিযুক্ত, তবে এটি আমার পরীক্ষায় ব্যর্থ হয়েছিল কারণ আমি চেয়েছিলাম যে বিন্দুবিহীন পূর্ণসংখ্যা সহ কোনও সংখ্যার জন্য রেজেক্স কাজ করতে পারে। ToFixed ছাড়া এটি শেষে একটি শূন্য খায় ats আমার খারাপ।
geekley

21

toFixedপদ্ধতি প্রয়োজনে যথাযথ রাউন্ডইং চেষ্টা করতে হবে। এটি পেছনের শূন্যগুলিও যুক্ত করবে, যা সর্বদা আদর্শ নয়।

(4.55555).toFixed(2);
//-> "4.56"

(4).toFixed(2);
//-> "4.00"

আপনি যদি কোনও সংখ্যায় ফেরতের মান কাস্ট করেন তবে সেই পিছনের শূন্যগুলি বাদ দেওয়া হবে। এটি আপনার নিজের রাউন্ডিং বা ট্র্যাঙ্কেশন গণিত করার চেয়ে সহজ পদ্ধতির।

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

1
কৃপণ, তবে ঠিক আমি যা খুঁজছিলাম: তাৎপর্যপূর্ণ ট্রেলিং জিরোগুলি সরিয়ে ফেলছি (অবশ্যই আমরা toFixedকলটির মাধ্যমে গুরুত্বপূর্ণ করেছিলাম )। এটি একটি অদ্ভুত UX প্রান্ত মামলা।
worc

12

আমার মূলত একই চাহিদা ছিল এবং আমি দেখেছি যে এই কার্যকারিতাটির জন্য কোনও বিল্ট-ইন মেকানিজম নেই।

ট্রেলিং শূন্যগুলি ছাঁটাবার পাশাপাশি আমার ব্যবহারকারীর বর্তমান লোকেলের জন্য আউটপুটটিও বন্ধ করে ফর্ম্যাট করার প্রয়োজন ছিল (যেমন 123,456.789)।

এ সম্পর্কে আমার সমস্ত কাজকে গিটারহাবটিতে প্রশংসিত ফ্ল্যাট.জেস (এমআইটি লাইসেন্স) হিসাবে অন্তর্ভুক্ত করা হয়েছে: https://github.com/dperish/ ব্যাখ্যা tyFloat.js


ব্যবহারের উদাহরণ:

prettyFloat(1.111001, 3) // "1.111"
prettyFloat(1.111001, 4) // "1.111"
prettyFloat(1.1111001, 5) // "1.1111"
prettyFloat(1234.5678, 2) // "1234.57"
prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us)


আপডেট হয়েছে - আগস্ট, 2018


সমস্ত আধুনিক ব্রাউজার এখন ECMAScript আন্তর্জাতিকীকরণ API সমর্থন করে , যা ভাষার সংবেদনশীল স্ট্রিং তুলনা, সংখ্যা বিন্যাস এবং তারিখ এবং সময় ফর্ম্যাটিং সরবরাহ করে।

let formatters = {
    default: new Intl.NumberFormat(),
    currency: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
    whole: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
    oneDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 1, maximumFractionDigits: 1 }),
    twoDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2 })
};

formatters.twoDecimal.format(1234.5678);  // result: "1,234.57"
formatters.currency.format(28761232.291); // result: "$28,761,232"

পুরানো ব্রাউজারগুলির জন্য, আপনি এই পলিফিলটি ব্যবহার করতে পারেন: https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en


এটিই খুঁজছিল। আপনাকে অবশ্যই একটি এনএমপি প্যাকেজ তৈরি করতে হবে।
এনজেও

সুতরাং আমার সম্ভবত এটি আপডেট করা উচিত, কারণ এটি এখন আন্তর্জাতিকীকরণ এপিআইয়ের মাধ্যমে সম্ভব।
29-30

2
এটি খুব সহায়ক, ভাগ করে নেওয়ার জন্য ধন্যবাদ এবং পাশাপাশি আপডেটের জন্য ধন্যবাদ।
জেগডসফট


9

ভাসমান সংখ্যা কমাতে আপনি এটি ব্যবহার করতে পারেন

var n = 0.0000;
n = parseFloat(n.toString()); 

//output n = 0; 
// n = 3.14000; --> n = 3.14;

7

খাঁটি রেজেক্স উত্তর

n.replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');

আমি অবাক হয়েছি কেন কেউ দেয় নি!


এটি সংখ্যার সাথে কাজ করবে না (সংখ্যাগুলি মূল প্রশ্নে বর্ণিত আছে)। আমি যদিও স্ট্রিং প্রতিনিধিত্ব জন্য সমাধান পছন্দ!
বেনিহিলারিয়াস

6

আমার যখন এই সমস্যাটি সমাধান করার দরকার ছিল তখন যখন জাঙ্গো কোনও পাঠ্য ক্ষেত্রে দশমিক প্রকারের মান প্রদর্শন করে। উদাহরণস্বরূপ যখন '1' এর মান ছিল। এটি '1.00000000' প্রদর্শন করবে। যদি '1.23' মান হয় তবে এটি '1.23000000' প্রদর্শন করবে (8 এর 'দশমিক_প্লেস' সেটিংয়ের ক্ষেত্রে)

পার্সফ্লোট ব্যবহার করা আমার পক্ষে একটি বিকল্প ছিল না কারণ এটি সম্ভব হ'ল একই মানটি ফেরত দেয় না। টু ফিক্সড কোনও বিকল্প ছিল না যেহেতু আমি কোনও কিছুই ঘটাতে চাই না, তাই আমি একটি ফাংশন তৈরি করেছি:

function removeTrailingZeros(value) {
    value = value.toString();

    # if not containing a dot, we do not need to do anything
    if (value.indexOf('.') === -1) {
        return value;
    }

    # as long as the last character is a 0 or a dot, remove it
    while((value.slice(-1) === '0' || value.slice(-1) === '.') && value.indexOf('.') !== -1) {
        value = value.substr(0, value.length - 1);
    }
    return value;
}

এটি কার্যকর হয় তবে এটি বেশ অযোগ্য, যেহেতু এটি কার্যকরভাবে প্রতি একাধিক স্ট্রিং তৈরি করে। কোনও টেবিলের সমস্ত কক্ষে এটি চালানোর কল্পনা করুন, যেখানে একটি ভাল সংখ্যা ছিল .00000। এর চেয়ে আরও ভাল বিকল্প হ'ল সেখানে কতগুলি পিছনে জিরো ছিল তা নির্ধারণ করা, তারপরে একসাথে স্লাইসটি করুন। একটি চরিত্র কী তা নির্ধারণ করা, মূলত দক্ষ, বিভক্ত স্ট্রিংগুলি তাই কম।
ডেরেক নাইজেল বার্ত্রাম

আমি আপনার পরামর্শের অনুরূপ ডেরেকের মতোই করেছি: github.com/rek/remove-trailing-zeros/blob/master/…
রেকারনার

নিখুঁত পরীক্ষাটি এখানে: jsperf.com/remove-trailing-zeros/1 , আপনি ঠিক বলেছেন, শূন্যগুলি খুঁজে বের করা এবং সেগুলি সরিয়ে ফেলা উপায় দ্রুত!
রেখনার

4

এই সমাধানগুলির কোনওটিই খুব কম সংখ্যক জন্য আমার পক্ষে কাজ করে নি। http://numeraljs.com/ আমার জন্য এটি সমাধান করেছে।

parseFloat(0.00000001.toFixed(8));
// 1e-8

numeral(0.00000001).format('0[.][00000000]');
// "0.00000001"

এটি 6 টিরও বেশি নির্ভুলতা পরিচালনা করতে পারে না। আমি বলব এই লাইব্রেরিটি যদি অল্প সংখ্যার জন্য বোঝানো হয় তবে এটি অকেজো। অবশ্যই সুপারিশ করা হয় না।
ড্যানিয়েল কুমাক

2

যদি আপনি কোনও কারণে ফ্লোটগুলি ব্যবহার করতে না পারেন (যেমন অর্থের ফ্লোট জড়িত) এবং ইতিমধ্যে একটি সঠিক সংখ্যার প্রতিনিধিত্বকারী স্ট্রিং থেকে শুরু করে থাকেন তবে আপনি এই সমাধানটি কার্যকর খুঁজে পেতে পারেন। এটি একটি সংখ্যার প্রতিনিধিত্ব করে একটি স্ট্রিংকে ডাব্লু / আউট ট্রেলিং শূন্যের প্রতিনিধিত্ব করে একটি স্ট্রিংতে রূপান্তর করে।

function removeTrailingZeroes( strAmount ) {
    // remove all trailing zeroes in the decimal part
    var strDecSepCd = '.'; // decimal separator
    var iDSPosition = strAmount.indexOf( strDecSepCd ); // decimal separator positions
    if ( iDSPosition !== -1 ) {
        var strDecPart = strAmount.substr( iDSPosition ); // including the decimal separator

        var i = strDecPart.length - 1;
        for ( ; i >= 0 ; i-- ) {
            if ( strDecPart.charAt(i) !== '0') {
                break;
            }
        }

        if ( i=== 0 ) {
            return strAmount.substring(0, iDSPosition);
        } else {
            // return INTPART and DS + DECPART including the rightmost significant number
            return strAmount.substring(0, iDSPosition) + strDecPart.substring(0,i + 1);
        }
    }

    return strAmount;
}

0

সমস্ত উত্তর - এবং মন্তব্যগুলি পড়ার পরে আমি এটি দিয়ে শেষ করেছি:

function isFloat(n) {
    let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n)) : n;
    return number;
}

আমি জানি যে ব্যবহার evalকোনওভাবেই ক্ষতিকারক হতে পারে তবে এটি আমাকে অনেক সাহায্য করেছিল।

তাই:

isFloat(1.234000);     // = 1.234;
isFloat(1.234001);     // = 1.234001
isFloat(1.2340010000); // = 1.234001

আপনি যদি দশমিক স্থান সীমাবদ্ধ করতে চান তবে toFixed()অন্যরা নির্দেশিত হিসাবে ব্যবহার করুন ।

let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n).toFixed(3)) : n;

এটাই.


0

আমার কোনও চলমান শূন্যগুলি অপসারণ করতে হবে তবে কোনও জিরো সহ কমপক্ষে 2 দশমিক দশমিক 7 ডলিমাল রাখা দরকার ।
টো ফিক্সড (6) দ্বারা উত্পাদিত সংখ্যাগুলি আমি 6 দশমিক দশমিক স্ট্রিং।

প্রত্যাশিত ফলাফল:

var numstra = 12345.000010 // should return 12345.00001
var numstrb = 12345.100000 // should return 12345.10
var numstrc = 12345.000000 // should return 12345.00
var numstrd = 12345.123000 // should return 12345.123

সমাধান:

var numstr = 12345.100000

while (numstr[numstr.length-1] === "0") {           
    numstr = numstr.slice(0, -1)
    if (numstr[numstr.length-1] !== "0") {break;}
    if (numstr[numstr.length-3] === ".") {break;}
}

console.log(numstr) // 12345.10

লজিক:

স্ট্রিংয়ের শেষ অক্ষরটি যদি শূন্য হয় তবে লুপ ফাংশনটি চালান।
শেষ অক্ষরটি সরিয়ে স্ট্রিং ভেরিয়েবল আপডেট করুন।
আপডেট হওয়া স্ট্রিংয়ের শেষ অক্ষরটি যদি শূন্য না হয় তবে শেষ লুপ হয়।
যদি শেষের অক্ষরটিকে তৃতীয় থেকে শেষের স্ট্রিং আপডেট করা হয় তবে একটি শেষের লুপ।


-1

এখানে একটি সম্ভাব্য সমাধান:

var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001

eval(x) --> 1.234
eval(y) --> 1.234001

4
এই সাধারণ কাজের জন্য আপনার দরকার নেই! parseFloat()অনেক উপযুক্ত হবে।
হাচবত

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