মুদ্রা স্ট্রিং হিসাবে নম্বর বিন্যাস কিভাবে?


1841

আমি জাভাস্ক্রিপ্ট একটি মূল্য বিন্যাস করতে চাই। আমি একটি ফাংশন চাই যা floatএকটি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং এর stringমতো ফর্ম্যাট দেয়:

"$ 2,500.00"

এটি করার সর্বোত্তম উপায় কী?


8
formatNumberজাভাস্ক্রিপ্টে কোনও অন্তর্নির্মিত ফাংশন নেই
zerkms

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

8
@ user1308743 ফ্লোট দশমিক স্থান সঞ্চয় করে না। এটি একটি মান, বেস এবং অফসেট ব্যবহার করে সংখ্যা সঞ্চয় করে। 0.01 আসলে প্রতিনিধিত্বমূলক নয়। দেখুন: en.wikedia.org/wiki/Floating_Point#Acturacy_problems
ফিলিপ হোয়াইটহাউস

6
@ ব্যবহারকারী1308743: কল্পনা করুন যে আপনি খুব বড় সংখ্যক প্রতিনিধিত্ব করছেন (ধরুন যে আপনি ভাগ্যবান লোক এবং এটি আপনার ব্যাংক অ্যাকাউন্টের ভারসাম্য)। নির্ভুলতার ঘাটতির কারণে আপনি কি সত্যিই অর্থ ছাড়তে চান?
ereOn

163
তাহলে কেন কেউ নীচের পরামর্শ দেয়নি? (2500) .toLocaleString ("এন-জিবি", {শৈলী: "মুদ্রা", মুদ্রা: "জিবিপি", ন্যূনতম ফাংশন ডিজিটস: 2}) বিকাশকারী.মোজিলা.অর্গ
নিক গ্রেলে

উত্তর:


1789

Number.prototype.toFixed

এই সমাধানটি প্রতিটি একক বড় ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ:

  const profits = 2489.8237;

  profits.toFixed(3) //returns 2489.824 (rounds up)
  profits.toFixed(2) //returns 2489.82
  profits.toFixed(7) //returns 2489.8237000 (pads the decimals)

আপনার যা দরকার তা হ'ল মুদ্রা প্রতীক যুক্ত করা (উদাঃ "$" + profits.toFixed(2)) এবং আপনার পরিমাণ ডলারে থাকবে।

কাস্টম ফাংশন

আপনার যদি ,প্রতিটি ডিজিটের মধ্যে ব্যবহারের প্রয়োজন হয় তবে আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

function formatMoney(number, decPlaces, decSep, thouSep) {
decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces,
decSep = typeof decSep === "undefined" ? "." : decSep;
thouSep = typeof thouSep === "undefined" ? "," : thouSep;
var sign = number < 0 ? "-" : "";
var i = String(parseInt(number = Math.abs(Number(number) || 0).toFixed(decPlaces)));
var j = (j = i.length) > 3 ? j % 3 : 0;

return sign +
	(j ? i.substr(0, j) + thouSep : "") +
	i.substr(j).replace(/(\decSep{3})(?=\decSep)/g, "$1" + thouSep) +
	(decPlaces ? decSep + Math.abs(number - i).toFixed(decPlaces).slice(2) : "");
}

document.getElementById("b").addEventListener("click", event => {
  document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value);
});
<label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label>
<br />
<button id="b">Get Output</button>
<p id="x">(press button to get output)</p>

এটি এর মতো ব্যবহার করুন:

(123456789.12345).formatMoney(2, ".", ",");

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

(123456789.12345).formatMoney(2);

যদি আপনার সংস্কৃতিতে দুটি চিহ্ন সজ্জিত হয় (অর্থাত ইউরোপীয়রা) এবং আপনি ডিফল্ট ব্যবহার করতে চান তবে কেবল formatMoneyপদ্ধতিটিতে নিম্নলিখিত দুটি লাইনটি পেস্ট করুন :

    d = d == undefined ? "," : d, 
    t = t == undefined ? "." : t, 

কাস্টম ফাংশন (ES6)

আপনি যদি আধুনিক ইসসিএমএসক্রিপ্ট সিনট্যাক্স ব্যবহার করতে পারেন (যেমন বাবেলের মাধ্যমে), আপনি পরিবর্তে এই আরও সহজ ফাংশনটি ব্যবহার করতে পারেন:

function formatMoney(amount, decimalCount = 2, decimal = ".", thousands = ",") {
  try {
    decimalCount = Math.abs(decimalCount);
    decimalCount = isNaN(decimalCount) ? 2 : decimalCount;

    const negativeSign = amount < 0 ? "-" : "";

    let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString();
    let j = (i.length > 3) ? i.length % 3 : 0;

    return negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : "");
  } catch (e) {
    console.log(e)
  }
};
document.getElementById("b").addEventListener("click", event => {
  document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value);
});
<label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label>
<br />
<button id="b">Get Output</button>
<p id="x">(press button to get output)</p>


26
সবার আগে, দুর্দান্ত, সংক্ষিপ্ত কোড। যাইহোক, যদি আপনি আমেরিকান, আপনি অক্ষমতা পরিবর্তন করা উচিত dএবং tহতে .এবং ,যথাক্রমে যাতে আপনি আছে না যে তাদের প্রত্যেক সময় নির্দিষ্ট করার। এছাড়াও, আমি returnপড়ার জন্য বিবৃতিটির শুরুটি সংশোধন করার পরামর্শ দিচ্ছি : return s + '$' + [rest]অন্যথায় আপনি ডলার সাইন পাবেন না।
জেসন

744
লোকেরা কেন এই কোডটি সুন্দর মনে করে তা নিশ্চিত নয়। এটি অনিবার্য। এটি সুন্দরভাবে কাজ করছে বলে মনে হচ্ছে, তবে এটি সুন্দর নয়।
usr ডিরেক্টরির

86
এই ফর্ম্যাটমনি ফাংশনটি কোথাও কিছু মাইনযুক্ত জাভাস্ক্রিপ্ট কোড থেকে অনুলিপি করা হয়েছে? আপনি কি মূল পোস্ট করতে পারবেন না? সি, ডি, আই, জে, এন, এস এবং টি ভেরিয়েবলগুলি কীসের জন্য দাঁড়ায়? এই পোস্টটি আপভোট এবং মন্তব্যের পরিমাণ বিচার করে আমি ধরে নিতে পারি যে এই কোডটি সর্বত্র প্রোডাকশন ওয়েবসাইটগুলিতে আটকানো হয়েছে ... শুভেচ্ছা কোডটি যদি কোনও দিন থাকে তবে এটি বজায় রাখতে হবে!
zuallauz

259
"কবিতা"? অস্পষ্টতার মতো আরও এটি কোড গল্ফ নয়; একটু সাদা জায়গা ব্যবহার করুন। সঠিক বর্ণের নামগুলিও ক্ষতিগ্রস্থ হবে না।
কিথজগ্রান্ট


1508

Intl.numberformat

জাভাস্ক্রিপ্টের একটি নম্বর বিন্যাসক রয়েছে (আন্তর্জাতিকীকরণের API এর অংশ)।

// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
});

formatter.format(2500); /* $2,500.00 */

জেএস ফিডল

ব্যবহারের undefinedপ্রথম আর্গুমেন্ট (স্থানে 'en-US'উদাহরণে) সিস্টেম লোকেল (ব্যবহারকারী লোকেল ক্ষেত্রে কোড একটি ব্রাউজারে চলছে) ব্যবহার করতে। লোকেল কোডটির আরও ব্যাখ্যা

মুদ্রা কোডগুলির একটি তালিকা এখানে ।

সংখ্যা.প্রোটোটাইপ.টোলোকেলে স্ট্রিং ইনটেল.নম্বারফর্ম্যাট

বয়স্কদের সাথে এটির তুলনা একটি চূড়ান্ত নোট। toLocaleString। তারা উভয়ই একই কার্যকারিতা সরবরাহ করে। যাইহোক, ToLocaleString এর পুরানো অবতারগুলিতে (প্রি-ইন্টেল) আসলে লোকেলগুলি সমর্থন করে না : এটি সিস্টেমের লোকেল ব্যবহার করে। সুতরাং, নিশ্চিত হয়ে নিন যে আপনি সঠিক সংস্করণটি ব্যবহার করছেন ( MDN এর অস্তিত্বের জন্য যাচাই করার পরামর্শ দেয়Intl )। এছাড়াও, উভয়ের পারফরম্যান্স একক আইটেমের জন্য একই , তবে আপনার যদি ফর্ম্যাট করতে প্রচুর সংখ্যা থাকে তবে তা ব্যবহার করে Intl.NumberFormat~ 70 গুণ দ্রুত হয়। এখানে কীভাবে ব্যবহার করবেন toLocaleString:

(2500).toLocaleString('en-US', {
  style: 'currency',
  currency: 'USD',
}); /* $2,500.00 */

ব্রাউজার সমর্থন কিছু নোট

  • আজকাল বিশ্বব্যাপী .5৯.৫%, মার্কিন যুক্তরাষ্ট্রে 98% এবং ইইউতে 99% সমর্থন সহ ব্রাউজার সমর্থন এখন আর কোনও সমস্যা নয় is
  • জীবাশ্মযুক্ত ব্রাউজারগুলিতে এটি সমর্থন করার জন্য একটি শিম রয়েছে (আইই 8 এর মতো), আপনার যদি সত্যই প্রয়োজন হয়
  • আরও তথ্যের জন্য CanIUse এ দেখুন

89
এই আইডেম্যাটিক জাভাস্ক্রিপ্ট, সহজ এবং মার্জিত সমাধান হ'ল আমি যা খুঁজছিলাম।
গিলহেম সোলাস

9
এটিকে ভোট দেওয়া কারণ এটি একটি নির্বোধ সহজ উত্তর যা স্থানীয়ভাবে কাজ করে।
ট্র্যাসিভা

17
খুব নিশ্চিত যে ব্রাউজারগুলির একটি বেশ উচ্চ% এখন এটি সমর্থন করে। এটি আরও অনেক বেশি upvated করা উচিত।
ফ্ল্যাশ

2
এটি একটি দুর্দান্ত উত্তর এবং আমার এটি ডায়নামিক মুদ্রার মান নিয়ে কাজ করছে তাই যদি ইউরোপে ব্যবহার হয় তবে এটি ইউরোতে পরিবর্তিত হয় এবং ইউরো চিহ্নটি দেখায়। একটি ট্রিট কাজ!

3
এটি 2018 এবং এটি মূলত সর্বত্র সমর্থিত। এটি সঠিক উত্তর হওয়া উচিত।
27:38

1337

সংক্ষিপ্ত এবং দ্রুত সমাধান (সর্বত্র কাজ করে!)

(12345.67).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');  // 12,345.67

এই সমাধানের পিছনে ধারণাটি প্রথম মিল এবং কমা দিয়ে মিলিত বিভাগগুলি প্রতিস্থাপন করছে '$&,'মিলটি লুকোয়াদ অ্যাপ্রোচ ব্যবহার করে করা হয় । আপনি "একটি সংখ্যার সাথে তিনটি সংখ্যার সেট (এক বা একাধিক) এবং একটি বিন্দুর ক্রম অনুসরণ করলে" এই সংজ্ঞাটি পড়তে পারেন

পরীক্ষা:

1        --> "1.00"
12       --> "12.00"
123      --> "123.00"
1234     --> "1,234.00"
12345    --> "12,345.00"
123456   --> "123,456.00"
1234567  --> "1,234,567.00"
12345.67 --> "12,345.67"

ডেমো: http://jsfiddle.net/hAfMM/9571/


প্রসারিত সংক্ষিপ্ত সমাধান

Numberদশমিকের সংখ্যা [0 .. n]এবং সংখ্যা গোষ্ঠীর আকারের অতিরিক্ত সমর্থন যুক্ত করতে আপনি অবজেক্টের প্রোটোটাইপও প্রসারিত করতে পারেন [0 .. x]:

/**
 * Number.prototype.format(n, x)
 * 
 * @param integer n: length of decimal
 * @param integer x: length of sections
 */
Number.prototype.format = function(n, x) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\.' : '$') + ')';
    return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,');
};

1234..format();           // "1,234"
12345..format(2);         // "12,345.00"
123456.7.format(3, 2);    // "12,34,56.700"
123456.789.format(2, 4);  // "12,3456.79"

ডেমো / টেস্টস: http://jsfiddle.net/hAfMM/435/


সুপার এক্সটেন্ডেড সংক্ষিপ্ত সমাধান

এই সুপার এক্সটেন্ডেড সংস্করণে আপনি বিভিন্ন ডিলিমিটার প্রকার সেট করতে পারেন:

/**
 * Number.prototype.format(n, x, s, c)
 * 
 * @param integer n: length of decimal
 * @param integer x: length of whole part
 * @param mixed   s: sections delimiter
 * @param mixed   c: decimal delimiter
 */
Number.prototype.format = function(n, x, s, c) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\D' : '$') + ')',
        num = this.toFixed(Math.max(0, ~~n));

    return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));
};

12345678.9.format(2, 3, '.', ',');  // "12.345.678,90"
123456.789.format(4, 4, ' ', ':');  // "12 3456:7890"
12345678.9.format(0, 3, '-');       // "12-345-679"

ডেমো / টেস্টস: http://jsfiddle.net/hAfMM/612/


21
আমি আসলে এক পা এগিয়ে গেলেন .replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")
কলিজোশুয়া

4
ভিসিওএন এবং কালিজোশুয়া রেজিপ এক্সের সাথে কফিস্প্রিপ্ট সংস্করণ এবং দশমিক স্থান নির্দিষ্ট করার উপায় (যাতে আপনি 2 এর ডিফল্ট ছেড়ে যেতে পারেন বা দশমিক ছাড়াই 0 নির্দিষ্ট করতে পারেন):Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
এরিক অ্যান্ডারসন

11
@Abbas হ্যাঁ, প্রতিস্থাপন \.সঙ্গে $(লাইন শেষে), অর্থাৎ this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,")
ভিজিওএন

2
@ অ্যানুম্যান্ট নিয়মিত ব্যাকরণটি এখানে কিছুটা জটিল, তাই আমি আপনাকে প্রথমে নিয়মিত এক্সপ্রেশন সম্পর্কে ম্যানুয়ালগুলি পড়ার পরামর্শ দিই (যেমন এমডিএন তে )। এটা পিছনে ধারণা প্রথম ম্যাচ এবং কমা, অর্থাত সঙ্গে মিলেছে বিভাগে প্রতিস্থাপন করা হয় $1,মিলটি লুকোয়াদ অ্যাপ্রোচ ব্যবহার করে করা হয় । আপনি "একটি সংখ্যার সাথে তিনটি সংখ্যার সেট (এক বা একাধিক) এবং একটি বিন্দুর ক্রমিক অনুসরণ করলে" এটি একটি সংখ্যার সাথে মেলে হিসাবে প্রকাশ করতে পারেন ।
ভিজিওএন

2
@ জুলিয়েঁদ্রেব্রেয়ার দয়া করে একটি দীর্ঘ সংখ্যার উদাহরণ দিন যা এই পদ্ধতির সাথে কাজ করে না।
ভিজিওন

247

জাভাস্ক্রিপ্ট নম্বর অবজেক্টটি একবার দেখুন এবং দেখুন এটি আপনাকে সহায়তা করতে পারে কিনা।

  • toLocaleString() অবস্থান নির্দিষ্ট হাজার বিভাজক ব্যবহার করে একটি সংখ্যা বিন্যাস করবে।
  • toFixed() দশমিক স্থানে নির্দিষ্ট সংখ্যায় গোল করবে।

এগুলি একই সময়ে ব্যবহার করতে মানটির প্রকারটি অবশ্যই একটি সংখ্যায় ফিরে যেতে হবে কারণ তারা উভয়ই একটি স্ট্রুপ আউটপুট করে।

উদাহরণ:

Number((someNumber).toFixed(1)).toLocaleString()

2
ধন্যবাদ! এই ধারণার ভিত্তিতে আমি এমন একটি তৈরি করতে সক্ষম হয়েছি যা সংক্ষিপ্ত এবং যথেষ্ট সহজ! (এবং স্থানীয়করণ করা) দুর্দান্ত।
ড্যানিয়েল ম্যাগলিওলা

7
আসলে আপনি পারেন। যেমন ডলারের জন্য: '$' + (মান + 0.001)। টু লোকালস্ট্রিং ()। স্লাইস (0, -1)
জ্যাপ্রি

6
দেখে মনে হচ্ছে এটি দুর্দান্ত লাগবে তবে এই মুহুর্তে ব্রাউজারের সামান্য সমর্থন রয়েছে
acorncom

1
@ অ্যাকর্নকম আপনি কেন বলছেন যে "ছোট ব্রাউজার সমর্থন" আছে? জাভাস্ক্রিপ্ট ১.১ থেকে নম্বর অবজেক্টটি প্রায় ছিল। আপনার দাবি ব্যাক আপ যে একটি রেফারেন্স প্রদান করুন।
ডগ এস

2
যত্ন নেওয়া উচিত যে toLocaleStringসিস্টেম লোকেল ব্যবহার করে এমন একটি পুরাতন সংস্করণ রয়েছে এবং ECMAScript Intl API থেকে আসে এমন একটি নতুন (বেমানান)। এখানে ব্যাখ্যা করা হয়েছে । এই উত্তরটি পুরানো সংস্করণের জন্য উদ্দিষ্ট বলে মনে হচ্ছে।
এপ্রিল

162

নীচে প্যাট্রিক দেশজার্ডিনস (ওরফে ডওক) কোডটিতে কিছু মন্তব্য যুক্ত করা হয়েছে এবং কিছু ছোটখাটো পরিবর্তন রয়েছে:

/* 
decimal_sep: character used as deciaml separtor, it defaults to '.' when omitted
thousands_sep: char used as thousands separator, it defaults to ',' when omitted
*/
Number.prototype.toMoney = function(decimals, decimal_sep, thousands_sep)
{ 
   var n = this,
   c = isNaN(decimals) ? 2 : Math.abs(decimals), //if decimal is zero we must take it, it means user does not want to show any decimal
   d = decimal_sep || '.', //if no decimal separator is passed we use the dot as default decimal separator (we MUST use a decimal separator)

   /*
   according to [/programming/411352/how-best-to-determine-if-an-argument-is-not-sent-to-the-javascript-function]
   the fastest way to check for not defined parameter is to use typeof value === 'undefined' 
   rather than doing value === undefined.
   */   
   t = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, //if you don't want to use a thousands separator you can pass empty string as thousands_sep value

   sign = (n < 0) ? '-' : '',

   //extracting the absolute value of the integer part of the number and converting to string
   i = parseInt(n = Math.abs(n).toFixed(c)) + '', 

   j = ((j = i.length) > 3) ? j % 3 : 0; 
   return sign + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ''); 
}

এবং এখানে কিছু পরীক্ষা:

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert(123456789.67392.toMoney() + '\n' + 123456789.67392.toMoney(3) + '\n' + 123456789.67392.toMoney(0) + '\n' + (123456).toMoney() + '\n' + (123456).toMoney(0) + '\n' + 89.67392.toMoney() + '\n' + (89).toMoney());

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert((-123456789.67392).toMoney() + '\n' + (-123456789.67392).toMoney(-3));

ছোটখাটো পরিবর্তনগুলি হ'ল:

  1. Math.abs(decimals)যখন না হয় তখন কিছুটা সরানো হবে NaN

  2. decimal_sep খালি স্ট্রিং আর হতে পারে না (এক প্রকারের দশমিক বিভাজক হওয়া আবশ্যক)

  3. জাভাস্ক্রিপ্ট ফাংশনে কোনও আর্গুমেন্ট না প্রেরণ করা হয়েছে কি না তা নির্ধারণ করার জন্য আমরা কতটাtypeof thousands_sep === 'undefined' প্রস্তাবিত তা ব্যবহার করি

  4. (+n || 0)প্রয়োজন হয় না কারণ thisএকটি Numberবস্তু

জেএস ফিডল


8
আপনি '10' পার্সইন্টে রডিক্স হিসাবে ব্যবহার করতে চাইতে পারেন। অন্যথায়, '0' দিয়ে শুরু হওয়া যে কোনও সংখ্যা অষ্টাল নম্বর ব্যবহার করবে।
sohtimsso1970

3
@ sohtimsso1970: দেরিতে সাড়া পাওয়ার জন্য দুঃখিত, তবে আপনি আরও কিছু ব্যাখ্যা করতে পারেন? আমি দেখতে পাচ্ছি না যে কোনও সংখ্যাকে অষ্টাল হিসাবে ব্যাখ্যা করা যায়। parseIntসংখ্যা পূর্ণসংখ্যা অংশ পরম মূল্যের ওপর বলা হয়। ইন্টিগের অংশটি জিরো দিয়ে শুরু করা যাবে না যতক্ষণ না এটি কেবল একটি শূন্য! এবং parseInt(0) === 0হয় অষ্টাল বা দশমিক।
মার্কো ডেমাইও

উদাহরণস্বরূপ চেষ্টা করুন: parseInt ("016") ... 14 প্রদান করে, যেমন পার্সইন্ট এটি অষ্টাল এনকোডড হিসাবে ধরে নেয়, যখন একটি শূন্য দিয়ে স্ট্রিং শুরু হয়।
ট্র্যাকার 1

4
@ ট্র্যাকার 1: আমি বুঝতে পেরেছিলাম যে একটি নম্বর দিয়ে শুরু হওয়া অষ্টাল 0দ্বারা বিবেচিত হয় parseInt। তবে এই কোডটিতে ইনপুট (বা অন্য কোনও অক্টাল ফর্ম্যাট মান) হিসাবে parseIntগ্রহণের জন্য IMPOSSIBLE 016, কারণ এতে আর্গুমেন্টটি কার্যক্রমে parseIntপ্রক্রিয়াজাত হয় 1st ম Math.abs। সুতরাং parseIntশূন্য দিয়ে শুরু হওয়া সংখ্যাটি পাওয়ার কোনও উপায় নেই যদি না এটি কেবল একটি শূন্য বা 0.nnযেখানে nnদশমিক হয় are তবে স্ট্রিং 0এবং 0.nnস্ট্রিং উভয়ই parseIntসাদামাটা শূন্যে রূপান্তরিত হবে বলে মনে করা হয়েছে।
মার্কো ডেমাইও

এই ফাংশনটি ভুল:> (2030) .toMoney (0, '।', ''); <"2 03 0"
আন্তন পি রবুল

124

অ্যাকাউন্টিং.জেএস সংখ্যা, অর্থ এবং মুদ্রার বিন্যাসের জন্য একটি ক্ষুদ্র জাভাস্ক্রিপ্ট লাইব্রেরি।


... কেবল একটি মুদ্রা প্রতীক পাস করার কথা মনে রাখবেন অন্যথায় এটি আই 7 এবং আই 8 এ ত্রুটিযুক্ত হয়ে যায়, আই 99 যে কোনও উপায়েই ভাল
ভেক্টর

2
দেখে মনে হচ্ছে IE7 / IE8 বাগ ঠিক হয়ে গেছে।
মাদুর শ্যাফার

2
এটি একটি দুর্দান্ত গ্রন্থাগার, মুদ্রা প্রতীকটি পাস করতে সক্ষম হওয়াও একটি ভাল ধারণা, যেহেতু সমস্ত মুদ্রার বিবরণ একক ফাংশন কল / সেটিংসে অন্তর্ভুক্ত থাকে
farinspace

2
আমি এই বিষয়টি পছন্দ করি যে আপনি বিপরীতটি করতে পারেন - একটি ফর্ম্যাট মুদ্রার স্ট্রিং পাস করুন এবং সংখ্যার মান পাবেন value
নীল মনরো

2
অ্যাকাউন্টিং.জেএস ইদানীং বজায় রাখা মনে হয় না। সাম্প্রতিক পরিবর্তনগুলির একটি কাঁটাগাটি github.com/nashdot/accounting-js
যৌক্তিকদেব GoFundMonica

123

পরিমাণ একটি সংখ্যা হয়, তাহলে বলতে -123হলে,

amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });

স্ট্রিং উত্পাদন করবে "-$123.00"

এখানে একটি সম্পূর্ণ কাজের উদাহরণ


7
এই উত্তরটি আমার কাছে প্রায় ছিল, তবে আমার এটি প্রয়োজন নিকটেতম পয়সাতে গোল করা। এটিই আমি পরিমাণে ব্যবহার করেছি toলোক্যালস্ট্রিং ('এন-জিবি', {স্টাইল: 'মুদ্রা', মুদ্রা: 'জিবিপি', সর্বাধিক ফাংশন ডিজিটস: 2});
নিকো

উপরের কোডটি আপনি চান এমন সংখ্যার সাথে গোল করে। উদাহরণটি দেখুন এবং ইনপুট বাক্সে 1.237 টাইপ করুন।
ড্যানিয়েল বারবিলাস

3
সাফারি তে কাজ করছে বলে মনে হচ্ছে না। এটি কোনও বিন্যাস ছাড়াই কেবল স্ট্রিং হিসাবে নম্বরটি দেয়।
ল্যান্স অ্যান্ডারসন

1
বাহ, এটি সত্যিই দুর্দান্ত উত্তর। শীর্ষ হতে হবে।
ইথান

2
যদি কোনও কারণে আপনি সেন্ট না চান তবে আপনি দশমিক নির্ভুলতা এর সাথে পরিবর্তন করতে পারেন:minimumFractionDigits: 0
হোরাসিও

99

এখানে আমি দেখেছি সেরা জেএস মানি ফর্ম্যাটর:

Number.prototype.formatMoney = function(decPlaces, thouSeparator, decSeparator) {
    var n = this,
        decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces,
        decSeparator = decSeparator == undefined ? "." : decSeparator,
        thouSeparator = thouSeparator == undefined ? "," : thouSeparator,
        sign = n < 0 ? "-" : "",
        i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;
    return sign + (j ? i.substr(0, j) + thouSeparator : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : "");
};

এটি পুনরায় ফর্ম্যাট এবং এখান থেকে ধার করা হয়েছিল: https://stackoverflow.com/a/149099/751484

আপনাকে আপনার নিজস্ব মুদ্রা ডিজাইনার সরবরাহ করতে হবে (আপনি উপরে ব্যবহার করেছেন)।

এটি এটিকে কল করুন (যদিও নোট করুন যে আরোগুলিগুলি 2, কমা এবং সময়সীমার মধ্যে ডিফল্ট হয়, সুতরাং আপনার পছন্দ যদি আপনার কোনও আরোগুলি সরবরাহ করার প্রয়োজন হয় না):

var myMoney=3543.75873;
var formattedMoney = '$' + myMoney.formatMoney(2,',','.'); // "$3,543.76"

গ্লোবাল সাইন, i, j
হ্যাকলিক্যাক্র্যাক

6
@ হ্যাক্লিকেকার্যাক, সমস্ত ভেরিয়েবল স্থানীয়; তারা varবিবৃতিতে আছেন ।
জোনাথন এম

3
দুঃখিত, হ্যাঁ, যদিও আপনি যুক্তিগুলি পুনরায় বর্ণনা করছেন। আঁকাবাঁকা রেখা! ;)
হ্যাকলিক্যাক্র্যাক

পরিবর্তনশীল নামের ভয়াবহ ব্যবহার!
সেরজ সাগান

77

এখানে ইতিমধ্যে কিছু দুর্দান্ত উত্তর রয়েছে। এখানে আরও একটি চেষ্টা করা হয়েছে, কেবল মজাদার জন্য:

function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
        return  num=="-" ? acc : num + (i && !(i % 3) ? "," : "") + acc;
    }, "") + "." + p[1];
}

এবং কিছু পরীক্ষা:

formatDollar(45664544.23423) // "$45,664,544.23"
formatDollar(45) // "$45.00"
formatDollar(123) // "$123.00"
formatDollar(7824) // "$7,824.00"
formatDollar(1) // "$1.00"

সম্পাদিত: এখন এটি নেতিবাচক সংখ্যাগুলিও পরিচালনা করবে


কবিতা। উজ্জ্বল। আপনি কি কমে যাওয়ার চেষ্টা করেছেন (রাইটার) ( ডেভেলপার.মোজিলা.আর.ইন / জাভাস্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / যা কোনটি বিপরীত ()?
স্টিভ

1
@ স্টিভ - আপনি ঠিক বলেছেন তবে i = orig.length - i - 1কলব্যাকের মতো আপনাকে কিছু করা দরকার । তবুও, অ্যারের আরও একটি ট্র্যাভারসাল।
ওয়েইন

11
সামঞ্জস্যতা সম্পর্কে নয়: reduceপদ্ধতিটি বাস্তু স্ক্রিপ্ট ১.৮ এ প্রবর্তিত হয়েছিল এবং এটি ইন্টারনেট এক্সপ্লোরার ৮ এবং এর নীচে সমর্থিত নয়।
ব্লেইস

@ ব্লাইজ বলেছে, এই পদ্ধতিটি আইই 8 বা নীচে কাজ করবে না।
আরএসবারো

হ্যাঁ, এটি অবশ্যই সঠিক। উত্তরে যেমন উল্লিখিত হয়েছে, এটি কেবল মজাদার জন্য। এছাড়াও, এটি নেতিবাচক সংখ্যা ঠিক জরিমানা করা উচিত।
ওয়েইন

76

সমস্ত বর্তমান ব্রাউজারের জন্য কাজ করে

toLocaleStringভাষা-সংবেদনশীল উপস্থাপনায় একটি মুদ্রাকে ফর্ম্যাট করতে ব্যবহার করুন ( আইএসও 4217 মুদ্রা কোড ব্যবহার করে )।

(2500).toLocaleString("en-GB", {style: "currency", currency: "GBP", minimumFractionDigits: 2}) 

উদাহরণস্বরূপ @ ওয়েভেনমোরের জন্য দক্ষিণ আফ্রিকার র্যান্ড কোড স্নিপেট

console.log((2500).toLocaleString("en-ZA", {style: "currency", currency: "ZAR", minimumFractionDigits: 2}))
// -> R 2 500,00
console.log((2500).toLocaleString("en-GB", {style: "currency", currency: "ZAR", minimumFractionDigits: 2}))
// -> ZAR 2,500.00


1
কারণ 'লোকাল' এবং 'বিকল্পগুলি' যুক্তিগুলি ক্রোম 24, আই 11 এবং অপেরা 15 এর মতো খুব অল্প সংখ্যক ব্রাউজার দ্বারা সমর্থিত Firef ফায়ারফক্স, সাফারি এবং অন্যদের পুরানো সংস্করণগুলি এখনও এটি সমর্থন করে না।
ভিজিওন

3
সম্মত হয়েছে, এটি সমস্ত ব্রাউজারে পুরোপুরি সমর্থিত নয় (এখনও), তবে এটি এখনও একটি সমাধান। (এবং তর্কযুক্তভাবে সবচেয়ে কার্যকর সমাধান, এটির সমর্থনযোগ্য ব্রাউজারগুলির সাথে সামঞ্জস্যপূর্ণ হিসাবে এটি এগিয়ে রয়েছে এবং এটি জাভাস্ক্রিপ্ট
এপিআইয়ের একটি নথিযুক্ত

1
আমি এটি পছন্দ করি এবং খুশি যে এটি ভারতীয় অঙ্কের দলবদ্ধকরণের সাথে কাজ করে।
এমএসসি

7
এটি 2017 হিসাবে সম্পূর্ণরূপে সমর্থিত এবং একমাত্র সঠিক উত্তর হওয়া উচিত
এভজেনি

1
সর্বশেষ এবং সর্বশ্রেষ্ঠ :) এফএফ 69, ক্রোম 76, ইত্যাদি "আর 2 500,00" আমরা এখানে যা ব্যবহার করি তা নয়, এটি "আর 2,500.00" হওয়া উচিত, এন জিবি-র মতোই।
অ্যাভেনমোর

70

আমার মনে হয় আপনি যা চান তা f.nettotal.value = "$" + showValue.toFixed(2);


@ এই কাজটিকে ক্রাশ করুন তবে এটি আর করের ক্ষেত্রের মধ্যে গণনা বহন করে না?
রোকো দ্য টাকো

11
একবার আপনি এতে একটি $ চিহ্ন সংযোজন করার পরে, এটি আর সংখ্যা নয়, একটি স্ট্রিং।
16:58

এই বিকল্পটি হাজার হাজারের মধ্যে কমা রাখে না। :-(
সাইমন ইস্ট

29

Numeral.js - @adamwdraper দ্বারা সহজ সংখ্যার ফর্ম্যাটিংয়ের জন্য একটি জেএস লাইব্রেরি

numeral(23456.789).format('$0,0.00'); // = "$23,456.79"

কাঁটা নুম্ব্রো আরও বেশি ভালবাসা পেয়েছে বলে মনে হচ্ছে যে Numeral.js পরিত্যক্ত বলে মনে হয়েছে: github.com/foretagsplatsen/numbro
যৌক্তিকদেব GoFundMonica পছন্দ করেছেন

Numeral.js আবার সক্রিয়।
অ্যাডামড্রাপার 21

27

ঠিক আছে, আপনি যা বলেছিলেন তার উপর ভিত্তি করে, আমি এটি ব্যবহার করছি:

var DecimalSeparator = Number("1.2").toLocaleString().substr(1,1);

var AmountWithCommas = Amount.toLocaleString();
var arParts = String(AmountWithCommas).split(DecimalSeparator);
var intPart = arParts[0];
var decPart = (arParts.length > 1 ? arParts[1] : '');
decPart = (decPart + '00').substr(0,2);

return '£ ' + intPart + DecimalSeparator + decPart;

আমি উন্নতির পরামর্শের জন্য উন্মুক্ত (আমি কেবল এটি করার জন্য YUI অন্তর্ভুক্ত করতে পছন্দ করব না :-)) আমি ইতিমধ্যে জানি যে আমার "সনাক্তকরণ করা উচিত" "" এটি কেবলমাত্র দশমিক বিভাজক হিসাবে ব্যবহার করার পরিবর্তে ...


8
মনে রাখবেন যে আপনার সংস্করণটি দুটি দশমিক অঙ্কের সাথে সঠিকভাবে গোল করে না। উদাহরণস্বরূপ, 3.706 "£ 3.70" হিসাবে ফর্ম্যাট করা হবে, এটি "£ 3.71" হিসাবে অনুমিত হওয়ার মতো নয়।
এটস গোলাল

হ্যাঁ, এটি আমার বিশেষ ক্ষেত্রে ঠিক আছে, যেহেতু আমি ইতিমধ্যে যে পরিমাণের সাথে কাজ করছি তার সর্বাধিক 2 ডিজিট রয়েছে কারণ যেহেতু আমাকে 2 দশমিকের সাথে সংশোধন করতে হবে তার কারণটি কোনও দশমিক ছাড়াই বা কেবল 1 দিয়ে নয়
ড্যানিয়েল ম্যাগলিওলা

26

আমি লাইব্রেরি গ্লোবালাইজ (মাইক্রোসফ্ট থেকে) ব্যবহার করি :

সংখ্যা, মুদ্রা এবং তারিখগুলি স্থানীয়করণ এবং ব্যবহারকারীর লোকেল অনুসারে সেগুলি স্বয়ংক্রিয়ভাবে সঠিকভাবে ফর্ম্যাটেড করা একটি দুর্দান্ত প্রকল্প! ... এবং এটি jQuery এক্সটেনশন হওয়া সত্ত্বেও এটি বর্তমানে একটি 100% স্বতন্ত্র গ্রন্থাগার। আপনারা সবাইকে চেষ্টা করে দেখুন! :)


3
বাহ, এটিকে কেন বেশি উত্সাহ দেওয়া হচ্ছে না? সমস্ত ধরণের ফর্ম্যাটিংয়ের জন্য বড় স্ট্যান্ডার্ডাইজড লাইব্রেরি। সঠিক বিশ্বায়ন সহ শিল্প-মানক ফর্ম্যাটিং পরামিতি। দুর্দান্ত উত্তর !!
pbarranis

এটি এখনও আলফা পর্যায় হিসাবে বিবেচিত, সুতরাং সতর্কতার সাথে ব্যবহার করুন তবে দুর্দান্ত ফলাফল find
নীল মনরো

1
আলফা (বা বিটা) এর মধ্যে আর নেই। আমরা যখন সাফারিটি নতুন স্ট্যান্ডার্ডের জন্য অপেক্ষা করতে এবং IE <11 এর মৃত্যুর জন্য অপেক্ষা করি তখন এটি খুব কার্যকর বলে মনে হচ্ছে।
গাই শালনাট

25

জাভাস্ক্রিপ্ট-নম্বর-ফর্ম্যাটার (পূর্বে গুগল কোডে )

  • সংক্ষিপ্ত, দ্রুত, নমনীয় তবুও স্বতন্ত্র। এমআইটি লাইসেন্স সম্পর্কিত তথ্য, ফাঁকা লাইন এবং মন্তব্য সহ কেবলমাত্র 75 টি লাইন।
  • পছন্দসই #,##0.00বা প্রত্যাখ্যান সহ স্ট্যান্ডার্ড নম্বর ফর্ম্যাটিং গ্রহণ করুন -000.####
  • মতন এমন দেশ বিন্যাস স্বীকার করুন # ##0,00, #,###.##, #'###.##বা কোনো অ সংখ্যায়ন প্রতীকের প্রকার।
  • সংখ্যার ডিজিটাল গ্রুপিংয়ের কোনও সংখ্যা গ্রহণ করুন। #,##,#0.000বা #,###0.##সমস্ত বৈধ।
  • যেকোন রিলান্ড্যান্ট / বোকা-প্রমাণ বিন্যাস গ্রহণ করুন। ##,###,##.#বা 0#,#00#.###0#সব ঠিক আছে।
  • অটো নম্বর রাউন্ডিং।
  • সরল ইন্টারফেস, শুধু সরবরাহ মাস্ক & এই মত মান: format( "0.0000", 3.141592)
  • মাস্ক সহ একটি উপসর্গ এবং প্রত্যয় অন্তর্ভুক্ত করুন

(এর README থেকে উদ্ধৃতি)


23

মূল পদ্ধতিটি সরবরাহ করার জন্য জোনাথন এমকে +1 করুন। যেহেতু এটি সুস্পষ্টভাবে একটি মুদ্রার বিন্যাসক, তাই আমি এগিয়ে গিয়ে আউটপুটে মুদ্রা প্রতীক ('$' এর ডিফল্ট) যুক্ত করেছি এবং কয়েক হাজার বিভাজক হিসাবে একটি ডিফল্ট কমা যুক্ত করেছি। আপনি যদি আসলে কোনও মুদ্রার প্রতীক (বা হাজার হাজার বিভাজক) না চান তবে এটির পক্ষে যুক্তি হিসাবে কেবল "" (খালি স্ট্রিং) ব্যবহার করুন।

Number.prototype.formatMoney = function(decPlaces, thouSeparator, decSeparator, currencySymbol) {
    // check the args and supply defaults:
    decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces;
    decSeparator = decSeparator == undefined ? "." : decSeparator;
    thouSeparator = thouSeparator == undefined ? "," : thouSeparator;
    currencySymbol = currencySymbol == undefined ? "$" : currencySymbol;

    var n = this,
        sign = n < 0 ? "-" : "",
        i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;

    return sign + currencySymbol + (j ? i.substr(0, j) + thouSeparator : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : "");
};

প্রথম ভ্যারিয়ালটি কিন্ডা অদ্ভুত, কারণ ইতিমধ্যে ফাংশন ঘোষণায় vari ভেরিয়েবলগুলি ঘোষিত হয়েছে। তা ছাড়াও, ধন্যবাদ!
ধনী ব্র্যাডশো

2
তুমি ঠিক বলছো. এটি ত্রুটিটি আমি জোনাথন এম এর আসল থেকে এনেছি, যেখানে তারা সবাই একক বর্ণের মত প্রকাশের শৃঙ্খলিত রয়েছে। এগুলি সহজ অ্যাসাইনমেন্ট হওয়া উচিত। স্থাপন করা.
এক্সএমএল

এই বিষয়টির জন্য, আমি মনে করি এটি সম্ভবত সময়ের আগেই অপটিমাইজড এবং পাঠযোগ্যতার জন্য পুনরায় চুলকানো উচিত। তবে আমার লক্ষ্য ছিল ওপির কোডটি বাড়ানো, মৌলিকভাবে এটি পরিবর্তন না করা।
এক্সএমএল

এটি খুব খারাপ নয় - +n || 0একমাত্র জিনিস যা কিছুটা অদ্ভুত বলে মনে হয় (যাইহোক আমার কাছে)।
ধনী ব্র্যাডশ

2
thisএকটি পুরোপুরি দরকারী পরিবর্তনশীল নাম। এটিকে রূপান্তর করা nযাতে আপনি সংজ্ঞা সময়ে 3 টি অক্ষর সংরক্ষণ করতে পারেন এমন কোনও যুগে র‌্যাম এবং ব্যান্ডউইথকে কেবিতে গণনা করা প্রয়োজন হতে পারে, তবে কোনও যুগে মিনিফায়ার কেবল তখনই আবশ্যক হয় যখন উত্পাদন হিট হওয়ার আগে মিনিফায়ার তার সমস্ত যত্ন নেবে। অন্যান্য চালাক মাইক্রো-অপ্টিমাইজেশন কমপক্ষে বিতর্কযোগ্য।
এক্সএমএল

22

পিএইচপি ফাংশন "নাম্বার_ ফর্ম্যাট" এর একটি জাভাস্ক্রিপ্ট পোর্ট রয়েছে।

পিএইচপি বিকাশকারীদের পক্ষে এটি ব্যবহার করা সহজ এবং স্বীকৃত হিসাবে আমি এটি খুব দরকারী বলে মনে করি।

function number_format (number, decimals, dec_point, thousands_sep) {
    var n = number, prec = decimals;

    var toFixedFix = function (n,prec) {
        var k = Math.pow(10,prec);
        return (Math.round(n*k)/k).toString();
    };

    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);
    var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep;
    var dec = (typeof dec_point === 'undefined') ? '.' : dec_point;

    var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec); 
    //fix for IE parseFloat(0.55).toFixed(0) = 0;

    var abs = toFixedFix(Math.abs(n), prec);
    var _, i;

    if (abs >= 1000) {
        _ = abs.split(/\D/);
        i = _[0].length % 3 || 3;

        _[0] = s.slice(0,i + (n < 0)) +
               _[0].slice(i).replace(/(\d{3})/g, sep+'$1');
        s = _.join(dec);
    } else {
        s = s.replace('.', dec);
    }

    var decPos = s.indexOf(dec);
    if (prec >= 1 && decPos !== -1 && (s.length-decPos-1) < prec) {
        s += new Array(prec-(s.length-decPos-1)).join(0)+'0';
    }
    else if (prec >= 1 && decPos === -1) {
        s += dec+new Array(prec).join(0)+'0';
    }
    return s; 
}

( উদাহরণ থেকে নিচে অন্তর্ভুক্ত মূল এবং কমেন্টের জন্য মন্তব্য অন্তর্ভুক্ত যেখানে ব্লক )

// Formats a number with grouped thousands
//
// version: 906.1806
// discuss at: http://phpjs.org/functions/number_format
// +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +     bugfix by: Michael White (http://getsprink.com)
// +     bugfix by: Benjamin Lupton
// +     bugfix by: Allan Jensen (http://www.winternet.no)
// +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// +     bugfix by: Howard Yeend
// +    revised by: Luke Smith (http://lucassmith.name)
// +     bugfix by: Diogo Resende
// +     bugfix by: Rival
// +     input by: Kheang Hok Chin (http://www.distantia.ca/)
// +     improved by: davook
// +     improved by: Brett Zamir (http://brett-zamir.me)
// +     input by: Jay Klehr
// +     improved by: Brett Zamir (http://brett-zamir.me)
// +     input by: Amir Habibi (http://www.residence-mixte.com/)
// +     bugfix by: Brett Zamir (http://brett-zamir.me)
// *     example 1: number_format(1234.56);
// *     returns 1: '1,235'
// *     example 2: number_format(1234.56, 2, ',', ' ');
// *     returns 2: '1 234,56'
// *     example 3: number_format(1234.5678, 2, '.', '');
// *     returns 3: '1234.57'
// *     example 4: number_format(67, 2, ',', '.');
// *     returns 4: '67,00'
// *     example 5: number_format(1000);
// *     returns 5: '1,000'
// *     example 6: number_format(67.311, 2);
// *     returns 6: '67.31'
// *     example 7: number_format(1000.55, 1);
// *     returns 7: '1,000.6'
// *     example 8: number_format(67000, 5, ',', '.');
// *     returns 8: '67.000,00000'
// *     example 9: number_format(0.9, 0);
// *     returns 9: '1'
// *     example 10: number_format('1.20', 2);
// *     returns 10: '1.20'
// *     example 11: number_format('1.20', 4);
// *     returns 11: '1.2000'
// *     example 12: number_format('1.2000', 3);
// *     returns 12: '1.200'

এটি কেবলমাত্র একটি সঠিক ফাংশন:> সংখ্যা_ ফর্ম্যাট (2030, 0, '।', '') <'2 030' দুর্দান্ত! ধন্যবাদ
অ্যান্টন পি রবুল

21

একটি সংক্ষিপ্ত পদ্ধতি (স্থান, কমা বা পয়েন্ট সন্নিবেশ করার জন্য) নিয়মিত অভিব্যক্তি সহ?

    Number.prototype.toCurrencyString=function(){
        return this.toFixed(2).replace(/(\d)(?=(\d{3})+\b)/g,'$1 ');
    }

    n=12345678.9;
    alert(n.toCurrencyString());

20

এরকম কিছু দেখেনি। এটি বেশ সংক্ষিপ্ত এবং বুঝতে সহজ।

function moneyFormat(price, sign = '$') {
  const pieces = parseFloat(price).toFixed(2).split('')
  let ii = pieces.length - 3
  while ((ii-=3) > 0) {
    pieces.splice(ii, 0, ',')
  }
  return sign + pieces.join('')
}

console.log(
  moneyFormat(100),
  moneyFormat(1000),
  moneyFormat(10000.00),
  moneyFormat(1000000000000000000)
)

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

// higher order function that takes options then a price and will return the formatted price
const makeMoneyFormatter = ({
  sign = '$',
  delimiter = ',',
  decimal = '.',
  append = false,
  precision = 2,
  round = true,
  custom
} = {}) => value => {
  
  const e = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]
  
  value = round
    ? (Math.round(value * e[precision]) / e[precision])
    : parseFloat(value)
  
  const pieces = value
    .toFixed(precision)
    .replace('.', decimal)
    .split('')
  
  let ii = pieces.length - (precision ? precision + 1 : 0)
  
  while ((ii-=3) > 0) {
    pieces.splice(ii, 0, delimiter)
  }
  
  if (typeof custom === 'function') {
    return custom({
      sign,
      float: value, 
      value: pieces.join('') 
    })
  }
  
  return append
    ? pieces.join('') + sign
    : sign + pieces.join('')
}

// create currency converters with the correct formatting options
const formatDollar = makeMoneyFormatter()
const formatPound = makeMoneyFormatter({ 
  sign: '£',
  precision: 0
})
const formatEuro = makeMoneyFormatter({
  sign: '€',
  delimiter: '.',
  decimal: ',',
  append: true
})

const customFormat = makeMoneyFormatter({
  round: false,
  custom: ({ value, float, sign }) => `SALE:$${value}USD`
})

console.log(
  formatPound(1000),
  formatDollar(10000.0066),
  formatEuro(100000.001),
  customFormat(999999.555)
)


দুর্দান্ত কোড স্নিপেট, আপনাকে ধন্যবাদ। তবে, সাবধান হন, কারণ এটি IE এ কাজ করবে না কারণ ডিফল্ট প্যারামিটারগুলি সমর্থিত নয়, এবং "আইএন 11" তে "কনস্ট" এবং "লেট" সমর্থিত নয়। এইটি ঠিক করার জন্য: + মানি ফর্ম্যাট: ফাংশন (দাম, সাইন) {+ if (! চিহ্ন) চিহ্ন = '$'; + + টুকরা = parseFloat (PRICE) .toFixed (2) .split ( '') + + Var আ = pieces.length - 3
চার্লি Dalsass

@ চর্লিডালসাস কোনও উদ্বেগ নেই। প্রোডাকশন কোডের জন্য এটি ইএস 5 এ সংকলন করতে আমি ব্যাবেল ব্যবহার করার পরামর্শ দেব।
synthet1c

তবে কীভাবে ইউরো মুদ্রা করবেন? 1.000,00 ইউরো?

@ ইউয়াম ইউয়াম আমি আরও স্বাচ্ছন্দ্যের জন্য আরও ফর্ম্যাটিং বিকল্পগুলির সাথে একটি পূর্ণ উদাহরণ যুক্ত করেছি।
synthet1c

18

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

// Format numbers to two decimals with commas
function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    var chars = p[0].split("").reverse();
    var newstr = '';
    var count = 0;
    for (x in chars) {
        count++;
        if(count%3 == 1 && count != 1) {
            newstr = chars[x] + ',' + newstr;
        } else {
            newstr = chars[x] + newstr;
        }
    }
    return newstr + "." + p[1];
}

ব্রাউজার এবং নোডের পুরানো সংস্করণে উভয়ই কাজ করার জন্য আমার কিছু দরকার ছিল। এটি পুরোপুরি কাজ করে। ধন্যবাদ
এন

17

মূল অংশটি হাজার-বিভাজক সন্নিবেশ করা হচ্ছে, এটি এভাবে করা যেতে পারে:

<script type="text/javascript">
function ins1000Sep(val){
  val = val.split(".");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].replace(/(\d{3})/g,"$1,");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].indexOf(",")==0?val[0].substring(1):val[0];
  return val.join(".");
}
function rem1000Sep(val){
  return val.replace(/,/g,"");
}
function formatNum(val){
  val = Math.round(val*100)/100;
  val = (""+val).indexOf(".")>-1 ? val + "00" : val + ".00";
  var dec = val.indexOf(".");
  return dec == val.length-3 || dec == 0 ? val : val.substring(0,dec+3);
}
</script>

<button onclick="alert(ins1000Sep(formatNum(12313231)));">

IN1000Sep () তে নেতিবাচক মান প্রবেশ করার সময় আমি ভুল নম্বর আউটপুট পাই।
পিটার

16

function ফিক্সড ইন একটি বিল্ট-ইন রয়েছেjavascript

var num = new Number(349);
document.write("$" + num.toFixed(2));

এই উত্তরটি অপ্রয়োজনীয় দেখায়। ক্রাশের উত্তর ইতিমধ্যে মেন্টিনয়েড হয়েছেtoFixed()
আয়ান ডান

3
toFixed()Numberঅবজেক্টের একটি ফাংশন এবং এটি var numযদি একটি হয় তবে কাজ করবে না String, তাই অতিরিক্ত প্রসঙ্গটি আমাকে সহায়তা করেছিল।
timborden

15
function CurrencyFormatted(amount)
{
    var i = parseFloat(amount);
    if(isNaN(i)) { i = 0.00; }
    var minus = '';
    if(i < 0) { minus = '-'; }
    i = Math.abs(i);
    i = parseInt((i + .005) * 100);
    i = i / 100;
    s = new String(i);
    if(s.indexOf('.') < 0) { s += '.00'; }
    if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
    s = minus + s;
    return s;
}

উইলমাস্টার থেকে ।


ছোট এবং সরল। ধন্যবাদ.
কনার সিম্পসন

1
সহজ, তবে 1000- এর জন্য কোনও কমা নেই
অ্যারন

15

আমি গুগল ভিজ্যুয়ালাইজেশন এপিআই থেকে নম্বর ফর্ম্যাট ক্লাসের পরামর্শ দিই ।

আপনি এর মতো কিছু করতে পারেন:

var formatter = new google.visualization.NumberFormat({
    prefix: '$',
    pattern: '#,###,###.##'
});

formatter.formatValue(1000000); // $ 1,000,000

আমি আসা করি এটা সাহায্য করবে.


14

এটি হয়ত একটু দেরীতে হতে পারে তবে এখানে একটি পদ্ধতিটি আমি সহকর্মীর .toCurrencyString()পক্ষে সমস্ত সংখ্যায় লোকাল-সচেতন ফাংশন যুক্ত করার জন্য কাজ করেছি। অভ্যন্তরীণকরণ কেবলমাত্র সংখ্যার গোষ্ঠীকরণের জন্য, মুদ্রা সাইন নয় - আপনি যদি ডলার আউটপুট করে থাকেন তবে "$"সরবরাহ হিসাবে ব্যবহার করুন , কারণ $123 4567জাপান বা চীনতে মার্কিন যুক্তরাষ্ট্রে রয়েছে একই সংখ্যক মার্কিন ডলার $1,234,567। আপনি যদি ইউরো / ইত্যাদি আউটপুট দিচ্ছেন তবে মুদ্রা সাইন থেকে এটিকে পরিবর্তন করুন "$"

এটি আপনার হেডের যে কোনও জায়গায় বা যেখানে প্রয়োজন সেখানে ডিক্লেয়ার করুন আপনার প্রয়োজন এটির আগে:

  Number.prototype.toCurrencyString = function(prefix, suffix) {
    if (typeof prefix === 'undefined') { prefix = '$'; }
    if (typeof suffix === 'undefined') { suffix = ''; }
    var _localeBug = new RegExp((1).toLocaleString().replace(/^1/, '').replace(/\./, '\\.') + "$");
    return prefix + (~~this).toLocaleString().replace(_localeBug, '') + (this % 1).toFixed(2).toLocaleString().replace(/^[+-]?0+/,'') + suffix;
  }

তাহলে তুমি শেষ! আপনার (number).toCurrencyString()মুদ্রা হিসাবে নম্বর আউটপুট প্রয়োজন যে কোনও জায়গা ব্যবহার করুন ।

var MyNumber = 123456789.125;
alert(MyNumber.toCurrencyString()); // alerts "$123,456,789.13"
MyNumber = -123.567;
alert(MyNumber.toCurrencyString()); // alerts "$-123.57"

12

সাধারণত, একই জিনিসটি করার একাধিক উপায় রয়েছে তবে আমি ব্যবহারটি এড়াতে চাই Number.prototype.toLocaleStringকারণ এটি ব্যবহারকারীর সেটিংসের ভিত্তিতে বিভিন্ন মান ফিরিয়ে দিতে পারে ।

আমি এটিকে বাড়ানোর প্রস্তাব দিচ্ছি না Number.prototype- দেশীয় অবজেক্টগুলি প্রোটোটাইপগুলি প্রসারিত করা একটি খারাপ অভ্যাস, কারণ এটি অন্যান্য লোকের কোডের সাথে দ্বন্দ্বের কারণ হতে পারে (যেমন গ্রন্থাগার / ফ্রেমওয়ার্ক / প্লাগইনস) এবং ভবিষ্যতে জাভাস্ক্রিপ্ট প্রয়োগকরণ / সংস্করণগুলির সাথে সামঞ্জস্য হতে পারে না।

আমি বিশ্বাস করি যে নিয়মিত প্রকাশগুলিই সমস্যার জন্য সর্বোত্তম পন্থা, আমার বাস্তবায়নটি এখানে:

/**
 * Converts number into currency format
 * @param {number} number   Number that should be converted.
 * @param {string} [decimalSeparator]    Decimal separator, defaults to '.'.
 * @param {string} [thousandsSeparator]    Thousands separator, defaults to ','.
 * @param {int} [nDecimalDigits]    Number of decimal digits, defaults to `2`.
 * @return {string} Formatted string (e.g. numberToCurrency(12345.67) returns '12,345.67')
 */
function numberToCurrency(number, decimalSeparator, thousandsSeparator, nDecimalDigits){
    //default values
    decimalSeparator = decimalSeparator || '.';
    thousandsSeparator = thousandsSeparator || ',';
    nDecimalDigits = nDecimalDigits == null? 2 : nDecimalDigits;

    var fixed = number.toFixed(nDecimalDigits), //limit/add decimal digits
        parts = new RegExp('^(-?\\d{1,3})((?:\\d{3})+)(\\.(\\d{'+ nDecimalDigits +'}))?$').exec( fixed ); //separate begin [$1], middle [$2] and decimal digits [$4]

    if(parts){ //number >= 1000 || number <= -1000
        return parts[1] + parts[2].replace(/\d{3}/g, thousandsSeparator + '$&') + (parts[4] ? decimalSeparator + parts[4] : '');
    }else{
        return fixed.replace('.', decimalSeparator);
    }
}

2010/08/30 এ সম্পাদিত: দশমিক সংখ্যা সংখ্যা সেট করার বিকল্প যুক্ত করা হয়েছে। 2011/08/23 এ সম্পাদিত: দশমিক অঙ্কের সংখ্যা শূন্যে সেট করতে বিকল্প যুক্ত করা হয়েছে।


ToLocaleString এর বিষয়টি হ'ল এটি ব্যবহারকারীর সেটিংসের সাথে সামঞ্জস্য করে।
জোসেফ লেনাক্স

11

এখানে কয়েকটি সমাধান রয়েছে, সকলেই পরীক্ষার স্যুট, পরীক্ষার স্যুট এবং বেঞ্চমার্ক অন্তর্ভুক্ত করে, যদি আপনি পরীক্ষার জন্য অনুলিপি এবং পেস্ট করতে চান তবে এই জিস্টটি চেষ্টা করুন ।

পদ্ধতি 0 (RegExp)

Https://stackoverflow.com/a/14428340/1877620 এ বেস , তবে দশমিক বিন্দু না থাকলে ঠিক করুন।

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.');
        a[0] = a[0].replace(/\d(?=(\d{3})+$)/g, '$&,');
        return a.join('.');
    }
}

পদ্ধতি 1

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.'),
            // skip the '-' sign
            head = Number(this < 0);

        // skip the digits that's before the first thousands separator 
        head += (a[0].length - head) % 3 || 3;

        a[0] = a[0].slice(0, head) + a[0].slice(head).replace(/\d{3}/g, ',$&');
        return a.join('.');
    };
}

পদ্ধতি 2 (অ্যারেতে বিভক্ত করুন)

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.');

        a[0] = a[0]
            .split('').reverse().join('')
            .replace(/\d{3}(?=\d)/g, '$&,')
            .split('').reverse().join('');

        return a.join('.');
    };
}

পদ্ধতি 3 (লুপ)

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('');
        a.push('.');

        var i = a.indexOf('.') - 3;
        while (i > 0 && a[i-1] !== '-') {
            a.splice(i, 0, ',');
            i -= 3;
        }

        a.pop();
        return a.join('');
    };
}

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

console.log('======== Demo ========')
console.log(
    (1234567).format(0),
    (1234.56).format(2),
    (-1234.56).format(0)
);
var n = 0;
for (var i=1; i<20; i++) {
    n = (n * 10) + (i % 10)/100;
    console.log(n.format(2), (-n).format(2));
}

বিভাজক

আমরা যদি কাস্টম হাজার হাজার বিভাজক বা দশমিক বিভাজক চাই, ব্যবহার করুন replace():

123456.78.format(2).replace(',', ' ').replace('.', ' ');

পরীক্ষা স্যুট

function assertEqual(a, b) {
    if (a !== b) {
        throw a + ' !== ' + b;
    }
}

function test(format_function) {
    console.log(format_function);
    assertEqual('NaN', format_function.call(NaN, 0))
    assertEqual('Infinity', format_function.call(Infinity, 0))
    assertEqual('-Infinity', format_function.call(-Infinity, 0))

    assertEqual('0', format_function.call(0, 0))
    assertEqual('0.00', format_function.call(0, 2))
    assertEqual('1', format_function.call(1, 0))
    assertEqual('-1', format_function.call(-1, 0))
    // decimal padding
    assertEqual('1.00', format_function.call(1, 2))
    assertEqual('-1.00', format_function.call(-1, 2))
    // decimal rounding
    assertEqual('0.12', format_function.call(0.123456, 2))
    assertEqual('0.1235', format_function.call(0.123456, 4))
    assertEqual('-0.12', format_function.call(-0.123456, 2))
    assertEqual('-0.1235', format_function.call(-0.123456, 4))
    // thousands separator
    assertEqual('1,234', format_function.call(1234.123456, 0))
    assertEqual('12,345', format_function.call(12345.123456, 0))
    assertEqual('123,456', format_function.call(123456.123456, 0))
    assertEqual('1,234,567', format_function.call(1234567.123456, 0))
    assertEqual('12,345,678', format_function.call(12345678.123456, 0))
    assertEqual('123,456,789', format_function.call(123456789.123456, 0))
    assertEqual('-1,234', format_function.call(-1234.123456, 0))
    assertEqual('-12,345', format_function.call(-12345.123456, 0))
    assertEqual('-123,456', format_function.call(-123456.123456, 0))
    assertEqual('-1,234,567', format_function.call(-1234567.123456, 0))
    assertEqual('-12,345,678', format_function.call(-12345678.123456, 0))
    assertEqual('-123,456,789', format_function.call(-123456789.123456, 0))
    // thousands separator and decimal
    assertEqual('1,234.12', format_function.call(1234.123456, 2))
    assertEqual('12,345.12', format_function.call(12345.123456, 2))
    assertEqual('123,456.12', format_function.call(123456.123456, 2))
    assertEqual('1,234,567.12', format_function.call(1234567.123456, 2))
    assertEqual('12,345,678.12', format_function.call(12345678.123456, 2))
    assertEqual('123,456,789.12', format_function.call(123456789.123456, 2))
    assertEqual('-1,234.12', format_function.call(-1234.123456, 2))
    assertEqual('-12,345.12', format_function.call(-12345.123456, 2))
    assertEqual('-123,456.12', format_function.call(-123456.123456, 2))
    assertEqual('-1,234,567.12', format_function.call(-1234567.123456, 2))
    assertEqual('-12,345,678.12', format_function.call(-12345678.123456, 2))
    assertEqual('-123,456,789.12', format_function.call(-123456789.123456, 2))
}

console.log('======== Testing ========');
test(Number.prototype.format);
test(Number.prototype.format1);
test(Number.prototype.format2);
test(Number.prototype.format3);

মাপকাঠি

function benchmark(f) {
    var start = new Date().getTime();
    f();
    return new Date().getTime() - start;
}

function benchmark_format(f) {
    console.log(f);
    time = benchmark(function () {
        for (var i = 0; i < 100000; i++) {
            f.call(123456789, 0);
            f.call(123456789, 2);
        }
    });
    console.log(time.format(0) + 'ms');
}

// if not using async, browser will stop responding while running.
// this will create a new thread to benchmark
async = [];
function next() {
    setTimeout(function () {
        f = async.shift();
        f && f();
        next();
    }, 10);
}

console.log('======== Benchmark ========');
async.push(function () { benchmark_format(Number.prototype.format); });
next();

আপনার পদ্ধতি থেকে উন্নত করা হয়েছে 2. var a = this.toFixed (যথার্থতা) .স্প্লিট ('।') থেকে var গুণক = ম্যাথ.পো (10, নির্ভুলতা + 1), পুরো নাম্বার = ম্যাথ.ফ্লোয়ার (এই * গুণক) থেকে পরিবর্তন করুন ; var a = ম্যাথ.উইন্ড (পুরো সংখ্যা / 10) * 10 / গুণক; if (স্ট্রিং (a) .indexOf ('।') <1) {a + = '.00'; } a = স্ট্রিং (ক) .স্প্লিট ('।'), বগি কারণ টিক্সিক্স ব্যবহার করবেন না।
ভি

console.log (parseFloat ( '4,835') toFixed (2)।); > 4.83 কনসোল.লগ (পার্সফ্লোট ('54 .835 ')। টু ফিক্সড (2)); > 54.84 কনসোল.লগ (পার্সফ্লোট ('454.835')। টু ফিক্সড (2)); > 454.83 কনসোল.লগ (পার্সফ্লোট ('8454.835')। টু ফিক্সড (2)); > 8454,83 এই মান দশমিক এর সকল হওয়া উচিত .84 না .83
ভি


10

প্রথম এবং বেসিক regexp স্ট্রিংটি বিপরীত করে সঠিক কমা প্লেসমেন্টের জন্য একটি সহজ বিকল্প।

String.prototype.reverse = function() {
    return this.split('').reverse().join('');
};

Number.prototype.toCurrency = function( round_decimal /*boolean*/ ) {       
     // format decimal or round to nearest integer
     var n = this.toFixed( round_decimal ? 0 : 2 );

     // convert to a string, add commas every 3 digits from left to right 
     // by reversing string
     return (n + '').reverse().replace( /(\d{3})(?=\d)/g, '$1,' ).reverse();
};

10

আমি এটি থেকে পেয়েছি: অ্যাকাউন্টিং.জেএস । এটি খুব সহজ এবং পুরোপুরি আমার প্রয়োজন ফিট করে।

// Default usage:
accounting.formatMoney(12345678); // $12,345,678.00

// European formatting (custom symbol and separators), can also use options object as second parameter:
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99

// Negative values can be formatted nicely:
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000

// Simple `format` string allows control of symbol position (%v = value, %s = symbol):
accounting.formatMoney(5318008, { symbol: "GBP",  format: "%v %s" }); // 5,318,008.00 GBP

// Euro currency symbol to the right
accounting.formatMoney(5318008, {symbol: "€", precision: 2, thousand: ".", decimal : ",", format: "%v%s"}); // 1.008,00€ 


$('#price').val( accounting.formatMoney(OOA, { symbol: "€", precision: 2,thousand: ".", decimal :",",format: "%v%s" } ) );- 1.000,00 ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.