2009-02-17 4 views
181

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

"$ 1,100.00" -> 1100,00

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

ответ

359

Изъять все точечные/цифры:

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

, кажется, идеально подходит для меня, спасибо –

+0

+1 (Извините за предыдущий комментарий, факт, что вы на самом деле * исключая * точку, также не возникли по мне по какой-то причине.) – Tomalak

+3

Другая причина, по которой RegExp может быть элегантный. – OnesimusUnbound

3

Я знаю, что вы нашли решение на ваш вопрос, я просто хотел бы рекомендовать, возможно, вы посмотрите на следующий более обширный плагин JQuery для международных форматов чисел:

International Number Formatter

3

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

<script type="text/javascript"> 

var str="$1,112.12"; 
str = str.replace(",",""); 
str = str.replace("$",""); 
document.write(parseFloat(str)); 

</script> 
+4

не работает, только первая запятая заменена. – Lee

15

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

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

Стоит отметить, что вы не должны использовать float для любых приложений без игрушек при добавлении валюты. В итоге вы получите ** не ** точные итоги. – Ally

+6

Вы будете удивлены и недовольны, когда parseFloat («151.20» * 100) даст вам 15119.999999999998, но parseFloat («151.40» * 100) дает вам 15140. Никогда не используйте parseFloat за деньги. Используйте специальные библиотеки для работы с деньгами, такими как accounting.js или любые другие, предлагаемые здесь. – bambery

11

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

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 

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

+0

Теперь это интересный ответ, спасибо! – YangombiUmpakati

3

Я знаю, что это старый вопрос, но ответ 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{2}))?\D*$/; 
var parts = cur_re.exec(currency); 
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00')); 

Предположение:

  • стоимость валюты использует десятичную запись
  • нет цифр в строке, которые не являются частью стоимости валюты
  • стоимость валюты содержит 0 или 2 цифры в его дробной части *

Регулярное выражение может даже обрабатывать что-то вроде «1,999 долларов и 9 9 центов ", хотя это не намеченная функция, и на нее нельзя положиться.

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

+0

Спасибо. Лучший ответ. Простой и могучий. Я бы использовал его с (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $, чтобы получить валюту и - за центы. Таким образом, вы можете анализировать строки, например, 1.000, -. Валюта будет по частям [1] или части [4], а часть [3] включает центами в качестве числа или -. Чем вы можете нормализовать строку, как хотите. – CyberAleks

+0

Это очень плохо и опасно, это умножает числа меньше 10 на 100. Я глупо использовал его, прежде чем тестировать все числа с ним :( – sheavens

19

accounting.js - это путь. Я использовал его в проекте и имел очень хороший опыт его использования.

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

Вы можете найти его на GitHub

+1

Обновление: В этой библиотеке имеется 71 открытый вопрос и не редактировалось за 5 месяцев, поэтому я Не доверяю. https://github.com/openexchangerates/accounting.js/issues – Ryan

2
jQuery.preferCulture("en-IN"); 
var price = jQuery.format(39.00, "c"); 

выход: Rs. 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, ''); 

Над регулярного выражения будет удалить все, что не является цифра или period.So Вы можете получить строку без символа валюты, но в случае «Фр 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 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$")

2

// "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; 
} 
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; 
} 
Смежные вопросы