كيف يمكنني تنسيق الأرقام كسلسلة عملة في JavaScript؟

StackOverflow https://stackoverflow.com/questions/149055

  •  02-07-2019
  •  | 
  •  

سؤال

أرغب في تنسيق السعر في JavaScript.
أرغب في وظيفة تستغرق float كوسيطة وإرجاع أ string تنسيق مثل هذا:

"$ 2,500.00"

ما هي الطريقة الأفضل لعمل هذا؟

هل كانت مفيدة؟

المحلول 12

حسنًا، بناءً على ما قلته، سأستخدم هذا:

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 فقط للقيام بذلك :-)) أعلم بالفعل أنني يجب أن أتكتشف "." بدلاً من استخدامه فقط كمفصل عشري ...

نصائح أخرى

Number.prototype.toتم الإصلاح

هذا الحل متوافق مع كل متصفح رئيسي:

  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)

إذا كان بإمكانك استخدام بناء جملة ECMAScript الحديث (أيمن خلال Babel)، يمكنك استخدام هذه الوظيفة الأبسط بدلاً من ذلك:

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>

حل قصير وسريع (يعمل في كل مكان!)

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

تنسيق الرقم الدولي

تحتوي Javascript على منسق أرقام (جزء من واجهة برمجة تطبيقات التدويل).

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

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

شبيبة كمان

يستخدم undefined بدلاً من الوسيطة الأولى ('en-US' في المثال) لاستخدام لغة النظام (لغة المستخدم في حالة تشغيل الكود في المتصفح).

Intl.NumberFormat مقابل Number.prototype.toLocaleString

ملاحظة أخيرة مقارنة هذا مع الأقدم .toLocaleString.كلاهما يقدمان نفس الوظيفة بشكل أساسي.ومع ذلك، toLocaleString في تجسيداتها الأقدم (ما قبل Intl) لا يدعم اللغات في الواقع:ويستخدم لغة النظام.لذلك، تأكد من أنك تستخدم الإصدار الصحيح (تقترح MDN التحقق من وجود Intl).كما أن أداء كليهما هو نفسه بالنسبة لـ a أعزب العنصر، ولكن إذا كان لديك الكثير من الأرقام لتنسيقها، فاستخدمها Intl.NumberFormat هو ~ 70 مرة أسرع.وإليك كيفية الاستخدام toLocaleString:

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

بعض الملاحظات حول دعم المتصفح

  • لم يعد دعم المتصفح يمثل مشكلة في الوقت الحاضر مع دعم بنسبة 97% في الولايات المتحدة/الاتحاد الأوروبي
  • بالنسبة لأجزاء أخرى من العالم (92% مدعومة)، فإن أكبر المخالفين من حيث الدعم هم UC Mobile (ابتعد عن ذلك) وOpera Mini (مشلول بالتصميم)
  • هناك الرقائق لدعمه على المتصفحات القديمة
  • القي نظرة على هل بإمكاني استخدم لمزيد من المعلومات

ألق نظرة على جافا سكريبت رقم اعترض ومعرفة ما إذا كان يمكن أن يساعدك.

  • toLocaleString() سيتم تنسيق رقم باستخدام فاصل الآلاف الخاص بالموقع.
  • toFixed() سيتم تقريب الرقم إلى عدد محدد من المنازل العشرية.

لاستخدام هذه العناصر في نفس الوقت، يجب تغيير نوع القيمة مرة أخرى إلى رقم لأن كلاهما ينتج سلسلة.

مثال:

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

أدناه هو باتريك ديجاردان (الاسم المستعار داوك) كود مع قليل من التعليقات المضافة وبعض التغييرات الطفيفة:

/* 
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 [https://stackoverflow.com/questions/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' كما هو مقترح في أفضل طريقة لتحديد ما إذا لم يتم إرسال الوسيطة إلى وظيفة JavaScript

  4. (+n || 0) ليست هناك حاجة ل this هو Number هدف

شبيبة كمان

accounting.js هي مكتبة جافا سكريبت صغيرة لتنسيق الأرقام والمال والعملة.

إذا كان المبلغ رقمًا، فقل -123, ، ثم

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

سوف تنتج السلسلة "-$123.00".

وهنا العمل الكامل مثال.

إليك أفضل أداة تنسيق أموال JS رأيتها:

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"

هناك بالفعل بعض الإجابات الرائعة هنا.وهذه محاولة أخرى للتسلية فقط:

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"

تم التعديل:الآن سوف يتعامل مع الأرقام السالبة أيضًا

أعتقد أن ما تريده هو f.nettotal.value = "$" + showValue.toFixed(2);

فلماذا لم يقترح أحد ما يلي؟

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

يعمل مع معظم/بعض المتصفحات:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString#Browser_Compatibility

Number.js - مكتبة JS لتنسيق الأرقام بسهولة بواسطة @adamwdraper

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

أنا أستخدم المكتبة عولمة (من مايكروسوفت):

إنه مشروع رائع لتوطين الأرقام والعملات والتواريخ وتنسيقها تلقائيًا بالطريقة الصحيحة وفقًا للغة المستخدم!... وعلى الرغم من أنه يجب أن يكون امتدادًا لـ jQuery، فهو حاليًا مكتبة مستقلة بنسبة 100%.أقترح عليكم جميعا تجربتها!:)

جافا سكريبت رقم المنسق (سابقا في كود جوجل)

  • قصيرة وسريعة ومرنة ولكنها مستقلة. 75 سطرًا فقط تتضمن معلومات ترخيص معهد ماساتشوستس للتكنولوجيا (MIT) والأسطر الفارغة والتعليقات.
  • قبول تنسيق الأرقام القياسي مثل #,##0.00 أو مع النفي -000.####.
  • قبول أي تنسيق بلد مثل # ##0,00, #,###.##, #'###.## أو أي نوع من الرموز غير الترقيمية.
  • قبول أي أرقام من تجميع الأرقام. #,##,#0.000 أو #,###0.## كلها صالحة.
  • اقبل أي تنسيق زائد/مقاوم للخداع. ##,###,##.# أو 0#,#00#.###0# كلها بخير.
  • التقريب التلقائي للأرقام.
  • واجهة بسيطة، فقط قم بتوفير القناع والقيمة مثل هذا: format( "0.0000", 3.141592).
  • قم بتضمين بادئة ولاحقة مع القناع

(مقتطف من الملف التمهيدي الخاص به)

يوجد منفذ جافا سكريبت لوظيفة PHP "number_format".

أجده مفيدًا جدًا لأنه سهل الاستخدام ويمكن التعرف عليه لمطوري PHP.

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'

+1 إلى Jonathan M لتوفير الطريقة الأصلية.نظرًا لأن هذا منسق عملة بشكل صريح، فقد مضت قدمًا وأضفت رمز العملة (القيمة الافتراضية إلى '$') إلى الإخراج، وأضفت فاصلة افتراضية كفاصل الآلاف.إذا كنت لا تريد بالفعل رمز العملة (أو فاصل الآلاف)، فما عليك سوى استخدام "" (سلسلة فارغة) كوسيطة لذلك.

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) : "");
};

طريقة أقصر (لإدراج مسافة أو فاصلة أو نقطة) مع التعبير العادي؟

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

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

باتريك ديجاردانتبدو الإجابة جيدة، لكني أفضّل جافا سكريبت البسيط.إليك وظيفة كتبتها للتو لأخذ رقم وإعادته بتنسيق العملة (مطروحًا منه علامة الدولار)

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

هناك المدمج في function للتصليح في javascript

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

الجزء الرئيسي هو إدخال فواصل الألف، ويمكن القيام بذلك على النحو التالي:

<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)));">

أقترح فئة NumberFormat من جوجل التصور API.

يمكنك القيام بشيء مثل هذا:

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

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

اتمني ان يكون مفيدا.

لم أر هذا واحد.إنها موجزة جدًا وسهلة الفهم.

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)
)

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

من WillMaster.

قد يكون هذا متأخرًا بعض الشيء، ولكن إليك طريقة ابتكرتها للتو مع أحد زملائي في العمل لإضافة لغة مدركة .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"

كالعادة، هناك طرق متعددة لفعل الشيء نفسه ولكنني سأتجنب استخدامها Number.prototype.toLocaleString لأنه يمكنه إرجاع قيم مختلفة بناءً على إعدادات المستخدم.

كما أنني لا أوصي بتمديد Number.prototype - يعد توسيع النماذج الأولية للكائنات الأصلية ممارسة سيئة لأنه يمكن أن يسبب تعارضات مع أكواد الأشخاص الآخرين (على سبيل المثال.المكتبات/الأطر/المكونات الإضافية) وقد لا تكون متوافقة مع تطبيقات/إصدارات JavaScript المستقبلية.

أعتقد أن التعبيرات العادية هي أفضل طريقة لحل المشكلة، وإليك تطبيقي:

/**
 * 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:تمت إضافة خيار لضبط عدد الأرقام العشرية. تم التعديل بتاريخ 23/08/2011:تمت إضافة خيار لضبط عدد الأرقام العشرية على الصفر.

فيما يلي بعض الحلول، جميعها تجتاز مجموعة الاختبار ومجموعة الاختبار والمعيار المتضمن، إذا كنت تريد النسخ واللصق للاختبار، فجرّب هذا جوهر.

الطريقة 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('.');
    };
}

الطريقة الثانية (التقسيم إلى صفيف)

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('.');
    };
}

الطريقة الثالثة (الحلقة)

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();

لقد وجدت هذا من: accounting.js .إنه سهل للغاية ويناسب احتياجاتي تمامًا.

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

خيار بسيط لوضع الفاصلة بشكل صحيح عن طريق عكس السلسلة أولاً والتعبير العادي الأساسي.

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

لقد نجح مثال باتريك ديجاردان (Daok سابقًا) جيدًا بالنسبة لي.لقد انتقلت إلى Coffeescript إذا كان أي شخص مهتمًا.

Number.prototype.toMoney = (decimals = 2, decimal_separator = ".", thousands_separator = ",") ->
    n = this
    c = if isNaN(decimals) then 2 else Math.abs decimals
    sign = if n < 0 then "-" else ""
    i = parseInt(n = Math.abs(n).toFixed(c)) + ''
    j = if (j = i.length) > 3 then j % 3 else 0
    x = if j then i.substr(0, j) + thousands_separator else ''
    y = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_separator)
    z = if c then decimal_separator + Math.abs(n - i).toFixed(c).slice(2) else ''
    sign + x + y + z
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top