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