Как преобразовать строку валюты в двойную с помощью jQuery или Javascript?

237

У меня есть текстовое поле, в котором будет строка валюты , и мне нужно затем преобразовать эту строку в двойную, чтобы выполнить некоторые операции с ней.

"$1,100.00"1100.00

Это должно произойти на стороне клиента. У меня нет выбора, кроме как оставить строку валюты в качестве строки валюты в качестве входных данных, но мне нужно преобразовать / преобразовать ее в double, чтобы разрешить некоторые математические операции.

Бобби Борщич
источник

Ответы:

480

Удалить все не точки / цифры:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
CMS
источник
4
Кажется, это работает только там, где есть .00трейлинг. В противном случае действительные представления валюты, такие как «$ 1100» и «$ 1100». будет уменьшен на два порядка.
Брайан М. Хант
19
Имейте в виду, что это зависит от локали, так как другие локали используют «,» для десятичных дробей (например, 1.100,00 €). Некоторые другие локали даже используют другое стандартное количество цифр на группу (например, 3 десятичных знака).
смола
8
Чтобы обработать отрицательные числа в строке, я добавил '-' в список символов, чтобы принять, т.е. .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland
4
Также имейте в виду, что некоторые бухгалтерские приложения заключают числа в круглые скобки для обозначения отрицательных значений. Например: ($ 5,00) = - $ 5,00
Дэйв Л
1
Я знаю, что могу ответить на несколько лет позже, но вы также должны быть осторожны, если "currency = 0." вы получите сообщение об ошибке JavaScript, в котором говорится, что currency.replace не является функцией. Я просто добавил простую проверку, если валюта = 0, чтобы избежать этого.
Аллен
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
Райан,
20

Используйте регулярное выражение, чтобы удалить форматирование (доллар и запятую), и используйте parseFloat, чтобы преобразовать строку в число с плавающей точкой.

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
Джейми
источник
8
Стоит отметить, что вы не должны использовать float для любых не «игрушечных» приложений при добавлении валюты. Вы получите не точные итоги.
Союзник
6
Вы будете удивлены и несчастливы, когда parseFloat ("151.20" * 100) даст вам 15119.999999999998, а parseFloat ("151.40" * 100) даст вам 15140. Никогда не используйте parseFloat для денег. Используйте специальные библиотеки для работы с деньгами, такие как accounting.js или любые другие, предлагаемые здесь.
бамбери
15

Я знаю, что это старый вопрос, но хотел дать дополнительную опцию.

JQuery Globalize дает возможность анализировать формат, специфичный для культуры, с плавающей точкой.

https://github.com/jquery/globalize

Учитывая строку "$ 13 042,00", и Globalize установлен в en-US:

Globalize.culture("en-US");

Вы можете разобрать значение с плавающей точкой следующим образом:

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

Это даст вам:

13042.00

И позволяет работать с другими культурами.

Phill
источник
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 центов», хотя это не предназначенная функция, и на нее не следует полагаться.

Надеюсь, это кому-нибудь поможет.

Vindicar
источник
Спасибо. Лучший ответ. Простой и могучий. Я бы использовал его с (\ D *) (\ 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" 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 для международных форматов номеров:

Международный форматировщик чисел

IEnumerator
источник
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$")

bycoder
источник
3

Вы можете попробовать это

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

Олафур Вааге
источник
2
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");

выход: рупий 39,00

use jquery.glob.js,
    jQuery.glob.all.js
Раджеш Кумар Маурья
источник
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);
    }
Jyotiranjan
источник
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
melalj
источник