JQuery या जावास्क्रिप्ट के साथ एक मुद्रा स्ट्रिंग को डबल में कैसे बदलें?


237

मेरे पास एक टेक्स्ट बॉक्स है जिसमें एक मुद्रा स्ट्रिंग होगी जिसे मुझे उस पर कुछ संचालन करने के लिए उस स्ट्रिंग को डबल में बदलने की आवश्यकता है।

"$1,100.00"1100.00

यह सभी ग्राहक पक्ष होने की जरूरत है। मेरे पास मुद्रा स्ट्रिंग को एक मुद्रा स्ट्रिंग के रूप में इनपुट के रूप में छोड़ने के अलावा कोई विकल्प नहीं है लेकिन कुछ गणितीय कार्यों की अनुमति देने के लिए इसे एक डबल में डालने / बदलने की आवश्यकता है।

जवाबों:


480

सभी गैर डॉट / अंक निकालें:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));

4
ऐसा लगता है कि यह केवल वहां काम करता है जहां एक .00अनुगामी है। अन्यथा मुद्रा का वैध प्रतिनिधित्व जैसे "$ 1100" और "$ 1100।" परिमाण के दो आदेशों से कम हो जाएगा।
ब्रायन एम। हंट

19
ध्यान रखें कि यह स्थान-निर्भर है, जैसा कि अन्य स्थान दशमलव के लिए ',' का उपयोग करते हैं (जैसे 1.100,00 €)। कुछ अन्य स्थान भी प्रति समूह (जैसे 3 दशमलव) अंकों की विभिन्न मानक संख्या का उपयोग करते हैं।
स्मॉला

8
स्ट्रिंग में ऋणात्मक संख्याओं को संभालने के लिए, मैंने स्वीकार करने के लिए वर्णों की सूची में एक '-' जोड़ दिया, अर्थात .replace (/ [^ 0-9 - \।] + / G, "")
tonycoupland

4
यह भी ध्यान रखें कि कुछ लेखांकन एप्लिकेशन नकारात्मक मूल्यों को दर्शाने के लिए कोष्ठक में संख्याओं को लपेटते हैं। जैसे: ($ 5.00) = - $ 5.00
डेव एल

1
मुझे पता है कि मुझे यहाँ उत्तर देने में कई साल की देरी हो सकती है, लेकिन "मुद्रा = 0." होने पर आपको सावधान रहने की आवश्यकता है आपको यह कहते हुए एक जावास्क्रिप्ट त्रुटि मिलेगी कि Currency.replace कोई फ़ंक्शन नहीं है। मैंने इससे बचने के लिए सिर्फ एक साधारण चेक जोड़ा अगर मुद्रा = 0।
एलन

23

लेखांकन .js जाने का रास्ता है। मैंने इसे एक परियोजना में इस्तेमाल किया और इसका उपयोग करने का बहुत अच्छा अनुभव था।

accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000

आप इसे GitHub पर पा सकते हैं


6
अद्यतन: उस लाइब्रेरी में issues१ खुले मुद्दे हैं और उसे ५ महीनों में संपादित नहीं किया गया है, इसलिए मुझे इस पर भरोसा नहीं है। github.com/openexchangerates/accounting.js/issues
रयान

20

फॉर्मेटिंग (डॉलर और अल्पविराम) को हटाने के लिए एक रेगेक्स का उपयोग करें, और स्ट्रिंग को फ्लोटिंग पॉइंट नंबर में बदलने के लिए parseFloat का उपयोग करें। `

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;

7
वर्थ नोटिंग आप किसी भी गैर 'खिलौना' अनुप्रयोगों के लिए फ्लोट का उपयोग नहीं करना चाहिए जब आपकी मुद्रा जोड़ रहे हैं। आप के साथ खत्म हो जाएगा नहीं सटीक योग।
सहयोगी

6
आप हैरान और दुखी होंगे जब parseFloat ("151.20" * 100) आपको 15119.999999999998 देता है, लेकिन parseFloat ("151.40" * 100) आपको 15140 देता है। पैसों के लिए कभी भी parseFloat न करें। पैसे से निपटने के लिए विशिष्ट पुस्तकालयों का उपयोग करें, जैसे कि लेखांकन। जेएस या इनमें से किसी एक को यहां सुझाया गया है।
बाम्बरी

15

मुझे पता है कि यह एक पुराना सवाल है, लेकिन एक अतिरिक्त विकल्प देना चाहता है।

JQuery Globalize एक संस्कृति विशेष स्वरूप को फ़्लोट करने के लिए पार्स करने की क्षमता देता है।

https://github.com/jquery/globalize

एक स्ट्रिंग "$ 13,042.00" को देखते हुए, और ग्लोबलाइज़ सेट टू एन-यूएस:

Globalize.culture("en-US");

आप फ्लोट मूल्य को इस तरह पार्स कर सकते हैं:

var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));

यह आपको देगा:

13042.00

और आपको अन्य संस्कृतियों के साथ काम करने की अनुमति देता है।


10

मुझे पता है कि यह एक पुराना सवाल है, लेकिन सीएमएस के जवाब में एक छोटा सा दोष है: यह केवल तभी काम करता है जब मुद्रा प्रारूप का उपयोग करता है "। दशमलव विभाजक के रूप में। उदाहरण के लिए, यदि आपको रूसी रूबल के साथ काम करने की आवश्यकता है, तो स्ट्रिंग इस तरह दिखाई देगी: "1 000,00 रगड़।"

मेरा समाधान सीएमएस की तुलना में बहुत कम सुरुचिपूर्ण है, लेकिन यह चाल करना चाहिए।

var currency = "1 000,00 rub."; //it works for US-style currency strings as well
var cur_re = /\D*(\d+|\d.*?\d)(?:\D+(\d{2}))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));
console.log(number.toFixed(2));

मान्यताओं:

  • मुद्रा मूल्य दशमलव संकेतन का उपयोग करता है
  • स्ट्रिंग में कोई अंक नहीं हैं जो मुद्रा मूल्य का हिस्सा नहीं हैं
  • मुद्रा मूल्य में आंशिक अंश * में 0 या 2 अंक होते हैं।

Regexp यहां तक ​​कि "1,999 डॉलर और 99 सेंट" जैसे कुछ भी संभाल सकता है, हालांकि यह एक इच्छित विशेषता नहीं है और इस पर भरोसा नहीं किया जाना चाहिए।

उम्मीद है कि यह किसी की मदद करेगा।


धन्यवाद। सबसे बढ़िया उत्तर। सरल और पराक्रमी। मैं (\ D *) (\ d। *? \ D) (?: \ D + (\ {{2} | -)) के साथ इसका उपयोग करूंगा। (\ D *) मुद्रा पाने के लिए और - सेंट के लिए। तो आप 1.000 की तरह स्ट्रिंग्स को पार्स कर सकते हैं, - € भी। मुद्रा भागों [1] या भाग [4] और भाग [3] में संख्या या के रूप में सेंट शामिल होंगे। की तुलना में आप स्ट्रिंग को सामान्य कर सकते हैं जैसे आप चाहते हैं।
साइबरएक्ल्स

यह बहुत बुरा और खतरनाक है, यह गुणन 10 से 100 की संख्या से कम होता है। मैंने मूर्खता के साथ सभी नंबरों का परीक्षण करने से पहले इसका इस्तेमाल किया :(
sheavens

इसे रिपोर्ट करने के लिए @sheavens धन्यवाद। इसे इतनी देर से ठीक करने के लिए माफी, लेकिन नया संस्करण वास्तव में उन रकमों के लिए भी काम करता है।
विंदिकर


6

// "10.000.500,61 TL" price_to_number => 10000500.61

// "10000500.62" नंबर_to_price => 10.000.500,62

JS FIDDLE: https://jsfiddle.net/Limitlessisa/oxhgd32c/

var price="10.000.500,61 TL";
document.getElementById("demo1").innerHTML = price_to_number(price);

var numberPrice="10000500.62";
document.getElementById("demo2").innerHTML = number_to_price(numberPrice);

function price_to_number(v){
    if(!v){return 0;}
    v=v.split('.').join('');
    v=v.split(',').join('.');
    return Number(v.replace(/[^0-9.]/g, ""));
}

function number_to_price(v){
    if(v==0){return '0,00';}
    v=parseFloat(v);
    v=v.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    v=v.split('.').join('*').split(',').join('.').split('*').join(',');
    return v;
}

3

मुझे पता है कि आपने अपने प्रश्न का हल ढूंढ लिया है, मैं सिर्फ यह सुझाव देना चाहता था कि शायद आप अंतर्राष्ट्रीय फॉर्मूला के लिए अधिक व्यापक jQuery प्लगइन को देखें:

इंटरनेशनल नंबर फॉर्मेटर


3

यह मेरा कार्य है। सभी मुद्राओं के साथ काम करता है ।।

function toFloat(num) {
    dotPos = num.indexOf('.');
    commaPos = num.indexOf(',');

    if (dotPos < 0)
        dotPos = 0;

    if (commaPos < 0)
        commaPos = 0;

    if ((dotPos > commaPos) && dotPos)
        sep = dotPos;
    else {
        if ((commaPos > dotPos) && commaPos)
            sep = commaPos;
        else
            sep = false;
    }

    if (sep == false)
        return parseFloat(num.replace(/[^\d]/g, ""));

    return parseFloat(
        num.substr(0, sep).replace(/[^\d]/g, "") + '.' + 
        num.substr(sep+1, num.length).replace(/[^0-9]/, "")
    );

}

उपयोग: toFloat("$1,100.00")याtoFloat("1,100.00$")




0
    $ 150.00
    Fr. 150.00
     689.00

मैंने तीन मुद्रा प्रतीकों के ऊपर परीक्षण किया है। आप इसे दूसरों के लिए भी कर सकते हैं।

    var price = Fr. 150.00;
    var priceFloat = price.replace(/[^\d\.]/g, '');

नियमित अभिव्यक्ति के ऊपर वह सबकुछ निकाल देगा जो कोई अंक या अवधि नहीं है। तो आप मुद्रा प्रतीक के बिना स्ट्रिंग प्राप्त कर सकते हैं, लेकिन "Fr. 150.00" के मामले में यदि आप आउटपुट के लिए सांत्वना देते हैं, तो आपको मूल्य मिल जाएगा।

    console.log('priceFloat : '+priceFloat);

    output will be like  priceFloat : .150.00

जो गलत है, इसलिए आप "के सूचकांक की जाँच करें।" तब विभाजित करें और उचित परिणाम प्राप्त करें।

    if (priceFloat.indexOf('.') == 0) {
            priceFloat = parseFloat(priceFloat.split('.')[1]);
    }else{
            priceFloat = parseFloat(priceFloat);
    }

0
function NumberConvertToDecimal (number) {
    if (number == 0) {
       return '0.00'; 
    }
    number = parseFloat(number);
    number = number.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1");
    number = number.split('.').join('*').split('*').join('.');
    return number;
}


0

इस फ़ंक्शन को स्थानीय और मुद्रा सेटिंग में से जो भी काम करना चाहिए:

function getNumPrice(price, decimalpoint) {
    var p = price.split(decimalpoint);
    for (var i=0;i<p.length;i++) p[i] = p[i].replace(/\D/g,'');
    return p.join('.');
}

यह मानता है कि आप दशमलव बिंदु वर्ण जानते हैं (मेरे मामले में PHP से लोकेल सेट है, इसलिए मैं इसे प्राप्त करता हूं <?php echo cms_function_to_get_decimal_point(); ?>)।


0

यह मेरे लिए काम करता है और ज्यादातर धार मामलों को शामिल करता है :)

function toFloat(num) {
  const cleanStr = String(num).replace(/[^0-9.,]/g, '');
  let dotPos = cleanStr.indexOf('.');
  let commaPos = cleanStr.indexOf(',');

  if (dotPos < 0) dotPos = 0;

  if (commaPos < 0) commaPos = 0;

  const dotSplit = cleanStr.split('.');
  const commaSplit = cleanStr.split(',');

  const isDecimalDot = dotPos
    && (
      (commaPos && dotPos > commaPos)
      || (!commaPos && dotSplit[dotSplit.length - 1].length === 2)
    );

  const isDecimalComma = commaPos
    && (
      (dotPos && dotPos < commaPos)
      || (!dotPos && commaSplit[commaSplit.length - 1].length === 2)
    );

  let integerPart = cleanStr;
  let decimalPart = '0';
  if (isDecimalComma) {
    integerPart = commaSplit[0];
    decimalPart = commaSplit[1];
  }
  if (isDecimalDot) {
    integerPart = dotSplit[0];
    decimalPart = dotSplit[1];
  }

  return parseFloat(
    `${integerPart.replace(/[^0-9]/g, '')}.${decimalPart.replace(/[^0-9]/g, '')}`,
  );
}
toFloat('USD 1,500.00'); // 1500
toFloat('USD 1,500'); // 1500
toFloat('USD 500.00'); // 500
toFloat('USD 500'); // 500

toFloat('EUR 1.500,00'); // 1500
toFloat('EUR 1.500'); // 1500
toFloat('EUR 500,00'); // 500
toFloat('EUR 500'); // 500
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.