Ответ 1
Удалить все не точки/цифры:
var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
У меня есть текстовое поле, в котором будет строка валюты, и мне нужно затем преобразовать эту строку в двойную, чтобы выполнить некоторые операции с ней.
"$1,100.00"
→ 1100.00
Это должно произойти на стороне клиента. У меня нет выбора, кроме как оставить строку валюты в качестве строки валюты в качестве входных данных, но мне нужно преобразовать/преобразовать ее в double, чтобы разрешить некоторые математические операции.
Удалить все не точки/цифры:
var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
accounting.js - это путь. Я использовал его в проекте и имел очень хороший опыт его использования.
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000
Вы можете найти его на GitHub
Используйте регулярное выражение для удаления форматирования (доллар и запятую) и используйте parseFloat для преобразования строки в число с плавающей запятой.
var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
Я знаю, что это старый вопрос, но он хотел дать дополнительный вариант.
jQuery Globalize дает возможность анализировать формат, специфичный для культуры, для float.
https://github.com/jquery/globalize
С учетом строки "$ 13 042,00" и "Глобализация" установите в en-US:
Globalize.culture("en-US");
Вы можете разобрать значение float следующим образом:
var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));
Это даст вам:
13042.00
И позволяет работать с другими культурами.
В этом примере запустите ok
var currency = "$123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
alert(number);
Я знаю, что это старый вопрос, но в ответе 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'));
Предположения:
Регулярное выражение может даже обрабатывать что-то вроде "1 999 долларов и 99 центов", хотя это не предназначенная функция, и на нее не следует полагаться.
Надеюсь, это кому-нибудь поможет.
Я знаю, что вы нашли решение своего вопроса, я просто хотел порекомендовать, что, возможно, вы посмотрите на следующий более обширный плагин jQuery для форматов международных номеров:
Вы можете попробовать это
<script type="text/javascript">
var str="$1,112.12";
str = str.replace(",","");
str = str.replace("$","");
document.write(parseFloat(str));
</script>
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");
: Rs. 39.00
use jquery.glob.js,
jQuery.glob.all.js
// "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;
}
Это моя функция. Работает со всеми валютами.
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$")
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;
}
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;
}
Эта функция должна работать независимо от локали и настроек валюты:
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();?>
).
$ 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);
}