jQuery 또는 Javascript를 사용하여 통화 문자열을 이중으로 변환하는 방법은 무엇입니까?


237

통화 문자열 이있는 텍스트 상자가 있는데 그 문자열을 이중으로 변환하여 일부 작업을 수행해야합니다.

"$1,100.00"1100.00

이것은 모든 클라이언트 측에서 발생해야합니다. 통화 문자열을 입력 으로 통화 문자열로 두는 것 외에는 선택의 여지가 없지만 수학 연산을 허용하기 위해 통화 문자열을 이중으로 캐스트 / 변환해야합니다.

답변:


480

점이 아닌 숫자를 모두 제거하십시오.

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

4
.00후행 이있는 곳에서만 작동하는 것 같습니다 . 그렇지 않으면 "$ 1100"및 "$ 1100"과 같은 유효한 통화 표시 두 배 정도 줄어 듭니다.
Brian M. Hunt

19
다른 로케일은 소수점에 ','를 사용하므로 로케일에 따라 다릅니다 (예 : 1.100,00 €). 일부 다른 로케일은 그룹당 다른 표준 자릿수 (예 : 소수점 3 자리)를 사용합니다.
smola

8
문자열에 음수를 처리하기 위해, 나는 추가 '-'문자의 목록에 동의하는, 즉 .replace (/ [^ 0-9 - \.] + / g, "")
tonycoupland

4
또한 일부 회계 앱은 음수 값을 나타 내기 위해 숫자를 괄호로 묶습니다. 예 : ($ 5.00) =-$ 5.00
Dave L

1
답장에 몇 년 늦었을 수도 있지만 "통화 = 0"인 경우에도주의해야합니다. currency.replace가 함수가 아니라는 자바 스크립트 오류가 발생합니다. 이것을 피하기 위해 통화 = 0 인 경우 간단한 확인을 추가했습니다.
Allen

23

accounting.js 는 갈 길입니다. 나는 프로젝트에서 그것을 사용하고 그것을 사용하는 아주 좋은 경험을했습니다.

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

GitHub 에서 찾을 수 있습니다


6
업데이트 : 해당 라이브러리에 71 개의 공개 문제가 있으며 5 개월 안에 편집되지 않았으므로 신뢰할 수 없습니다. github.com/openexchangerates/accounting.js/issues
Ryan

20

정규식을 사용하여 서식 (달러 및 쉼표)을 제거하고 parseFloat를 사용하여 문자열을 부동 소수점 숫자로 변환하십시오 .`

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

7
통화를 추가 할 때 'Toy'이외의 응용 프로그램에 float를 사용해서는 안됩니다. 정확한 총계 가 아닙니다 .
Ally

6
parseFloat ( "151.20"* 100)가 15119.999999999998을 제공하지만 parseFloat ( "151.40"* 100)이 15140을 제공하면 놀라고 불행하게됩니다. parseFloat를 돈으로 사용하지 마십시오. accounting.js 또는 여기에 제안 된 다른 라이브러리와 같이 돈을 처리하기 위해 특정 라이브러리를 사용하십시오.
bambery

15

나는 이것이 오래된 질문이라는 것을 알고 있지만 추가 옵션을 원했습니다.

jQuery Globalize는 문화권 별 형식을 부동 소수점으로 구문 분석하는 기능을 제공합니다.

https://github.com/jquery/globalize

"$ 13,042.00"라는 문자열이 있고 Globalize는 en-US로 설정되었습니다.

Globalize.culture("en-US");

float 값을 다음과 같이 파싱 할 수 있습니다.

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

이것은 당신에게 줄 것이다 :

13042.00

그리고 다른 문화와 함께 일할 수 있습니다.


10

나는 이것이 오래된 질문이라는 것을 알고 있지만 CMS의 대답에는 하나의 작은 결함이있는 것 같습니다. 통화 형식이 "."을 사용하는 경우에만 작동합니다. 소수점 구분 기호로. 예를 들어, 러시아 루블로 작업해야하는 경우 문자열은 다음과 같습니다 : "1,000,00 문지름"

내 솔루션은 CMS보다 훨씬 우아하지는 않지만 트릭을 수행해야합니다.

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 자리 숫자를 포함합니다 *

정규 표현식은 "1,999 달러와 99 센트"와 같은 것을 처리 할 수 ​​있지만 의도 한 기능이 아니며 의존해서는 안됩니다.

이것이 누군가를 도울 수 있기를 바랍니다.


감사합니다. 가장 좋은 답변입니다. 간단하고 강력합니다. 통화를 얻기 위해 (\ D *) (\ d. *? \ d) (? : \ D + (\ d {2} |-))? (\ D *) $와 함께 사용하고 센트 단위로 사용합니다. 따라서 1.000과 같은 문자열을 구문 분석 할 수 있습니다. 통화는 파트 [1] 또는 파트 [4]로 구성되며 파트 [3]은 숫자 또는-로 센트를 포함합니다. 원하는대로 문자열을 정규화 할 수 있습니다.
CyberAleks

이것은 매우 나쁘고 위험하며 10에 100보다 작은 숫자를 곱합니다. 모든 숫자를 테스트하기 전에 어리석게도 사용했습니다. (
sheavens

@sheavens보고 해 주셔서 감사합니다. 너무 늦게 수정 해 드려 죄송하지만 새 버전은 실제로 그 합계에도 적용됩니다.
Vindicar


6

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

// "10000500.62"number_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$")


3

당신은 이것을 시도 할 수 있습니다

var str = "$1,112.12";
str = str.replace(",", "");
str = str.replace("$", "");
console.log(parseFloat(str));



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
var parseCurrency = function (e) {
    if (typeof (e) === 'number') return e;
    if (typeof (e) === 'string') {
        var str = e.trim();
        var value = Number(e.replace(/[^0-9.-]+/g, ""));
        return str.startsWith('(') && str.endsWith(')') ? -value: value;
    }

    return e;
} 

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.