Як конвертувати рядок валюти в подвійний за допомогою 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 доларів". зменшиться на два порядки.
Брайан М. Хант

19
Майте на увазі, що це залежить від місцевості, оскільки інші крамниці використовують ',' для десяткових знаків (наприклад, 1,100,00 €). Деякі інші локалі навіть використовують різну стандартну кількість цифр на групу (наприклад, 3 десяткові дроби).
смола

8
Для обробки негативних чисел у рядку я додав до списку символів '-', тобто .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland

4
Також пам’ятайте, що деякі облікові програми вказують числа в дужки, щоб позначити негативні значення. напр .: ($ 5,00) = - 5,00 $
Дейв Л

1
Я знаю, що я можу запізнитися на відповідь тут, але ви також повинні бути обережні, якщо "валюта = 0." ви отримаєте помилку javascript, кажучи, що Currency.replace не є функцією. Я щойно додав простий чек, якщо валюта = 0, щоб цього уникнути.
Аллен

23

account.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/isissue
Райан

20

Використовуйте регулярний вираз для видалення форматування (долар і кома), а parseFloat для перетворення рядка в число з плаваючою комою. "

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

7
Варто зауважити, що ви не повинні використовувати float для будь-яких додатків "Іграшка" під час додавання валюти. Ви отримаєте не точні підсумки.
Аллі

6
Ви будете здивовані і нещасні, коли parseFloat ("151.20" * 100) дає вам 15119.999999999998, але parseFloat ("151.40" * 100) дає вам 15140. Ніколи не використовуйте parseFloat для грошей. Використовуйте конкретні бібліотеки для роботи з грошима, наприклад, account.js або будь-яку з інших, запропонованих тут.
бамбук

15

Я знаю, що це старе питання, але хотів дати додатковий варіант.

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

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

І дозволяє працювати з іншими культурами.


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 цифри у її дробовій частині *

Regexp може навіть обробляти щось на зразок "1,999 доларів і 99 центів", хоча це не призначена функція, і на неї не слід покладатися.

Сподіваюся, що це комусь допоможе.


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

Це дуже погано і небезпечно, це множення чисел менше 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
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.