Jak przekonwertować ciąg waluty na podwójny za pomocą jQuery lub Javascript?

237

Mam pole tekstowe z ciągiem waluty , który następnie muszę przekonwertować na ciąg znaków podwójny, aby wykonać na nim niektóre operacje.

"$1,100.00"1100.00

Musi to nastąpić po stronie klienta. Nie mam wyboru, jak pozostawić ciąg waluty jako ciąg waluty jako dane wejściowe, ale muszę rzucić / przekonwertować go na podwójny, aby umożliwić pewne operacje matematyczne.

Bobby Borszich
źródło

Odpowiedzi:

480

Usuń wszystkie kropki / cyfry:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
CMS
źródło
4
Wygląda na to, że działa to tylko tam, gdzie występuje .00spływ. W przeciwnym razie prawidłowe przedstawienie waluty, takie jak „1100 $” i „1100 $”. zostaną zmniejszone o dwa rzędy wielkości.
Brian M. Hunt
19
Należy pamiętać, że jest to zależne od lokalizacji, ponieważ inne lokalizacje używają „,” po przecinku (np. 1.100,00 €). Niektóre inne lokalizacje używają nawet innej standardowej liczby cyfr na grupę (np. 3 miejsca po przecinku).
smola
8
Aby obsłużyć liczby ujemne w ciągu, dodałem znak „-” do listy znaków do zaakceptowania, tj. .Replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland
4
Należy również pamiętać, że niektóre aplikacje księgowe zawijają liczby w nawiasach, aby wskazać wartości ujemne. np .: (5,00 $) = - 5,00 $
Dave L
1
Wiem, że mogę spóźnić się z odpowiedzią tutaj o kilka lat, ale musisz też uważać, jeśli „currency = 0.” pojawi się błąd javascript mówiący, że currency.replace nie jest funkcją. Właśnie dodałem prosty czek, jeśli currency = 0, aby tego uniknąć.
Allen
23

Księgowość.js jest właściwą drogą. Użyłem go w projekcie i miałem bardzo dobre doświadczenia z nim związane.

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

Możesz go znaleźć na GitHub

Thomas Kremmel
źródło
6
Aktualizacja: ta biblioteka ma 71 otwartych problemów i nie była edytowana przez 5 miesięcy, więc nie ufam jej. github.com/openexchangerates/accounting.js/issues
Ryan
20

Użyj wyrażenia regularnego, aby usunąć formatowanie (dolar i przecinek), i użyj parseFloat, aby przekonwertować ciąg na liczbę zmiennoprzecinkową.`

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
Jamie
źródło
7
Warto zauważyć, że podczas dodawania waluty nie powinieneś używać liczby zmiennoprzecinkowej do żadnych aplikacji innych niż „Zabawki”. Będziesz skończyć z nie dokładnej sumy.
Ally
6
Będziesz zaskoczony i niezadowolony, gdy parseFloat („151.20” * 100) da ci 15119.99999999999998, ale parseFloat („151.40” * 100) da ci 15140. Nigdy nie używaj parseFloat dla pieniędzy. Używaj określonych bibliotek do obsługi pieniędzy, takich jak np. Account.js lub dowolnych innych sugerowanych tutaj.
bambery
15

Wiem, że to stare pytanie, ale chciałem dać dodatkową opcję.

JQuery Globalize umożliwia parsowanie formatu specyficznego dla kultury na zmiennoprzecinkowe.

https://github.com/jquery/globalize

Biorąc pod uwagę ciąg „13 042,00 $” i Globalizuj ustawiono na en-US:

Globalize.culture("en-US");

Możesz parsować wartość zmiennoprzecinkową w następujący sposób:

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

To da ci:

13042.00

I pozwala pracować z innymi kulturami.

Phill
źródło
10

Wiem, że to stare pytanie, ale odpowiedź CMS wydaje się mieć jedną drobną wadę: działa tylko wtedy, gdy format waluty używa „.” jako separator dziesiętny. Na przykład, jeśli chcesz pracować z rosyjskimi rublami, łańcuch będzie wyglądał następująco: „1 000,00 rub.”

Moje rozwiązanie jest znacznie mniej eleganckie niż CMS, ale powinno wystarczyć.

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));

Założenia:

  • wartość waluty używa notacji dziesiętnej
  • w ciągu nie ma cyfr, które nie są częścią wartości waluty
  • wartość waluty zawiera 0 lub 2 cyfry w części ułamkowej *

Wyrażenie regularne może obsłużyć nawet coś w rodzaju „1,999 dolarów i 99 centów”, chociaż nie jest to zamierzona funkcja i nie należy na niej polegać.

Mam nadzieję, że to komuś pomoże.

Vindicar
źródło
Dziękuję Ci. Najlepsza odpowiedź. Prosty i potężny. Użyłbym go z (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $, aby uzyskać walutę i - za centy. Możesz więc parsować łańcuchy takie jak 1.000, - €. Waluta będzie w częściach [1] lub części [4], a część [3] zawiera centy jako liczbę lub -. Następnie możesz znormalizować ciąg, jak chcesz.
CyberAleks,
To bardzo złe i niebezpieczne, to zwielokrotnia liczby mniejsze niż 10 przez 100. Głupio użyłem go przed przetestowaniem wszystkich liczb z nim :(
sheavens
@sheavens dzięki za zgłoszenie. Przepraszamy za naprawę tak późno, ale nowa wersja faktycznie działa również na te sumy.
Vindicar,
8

Ten przykład działa poprawnie

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

http://jsbin.com/ecAviVOV/2/edit

PaVen Nguyen
źródło
6

// „10.000.500,61 TL” cena_do_numeru => 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;
}
Nieograniczona isa
źródło
3

Wiem, że znalazłeś rozwiązanie swojego pytania, chciałem tylko polecić, abyś spojrzał na następującą, bardziej rozbudowaną wtyczkę jQuery dla międzynarodowych formatów liczb:

International Formater Number

IEnumerator
źródło
3

To moja funkcja. Działa ze wszystkimi walutami ..

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]/, "")
    );

}

Zastosowanie: toFloat("$1,100.00")lubtoFloat("1,100.00$")

bycoder
źródło
3

Możesz tego spróbować

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

Lalafur Waage
źródło
2
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");

dane wyjściowe to: Rs. 39,00

use jquery.glob.js,
    jQuery.glob.all.js
Rajesh Kumar Maurya
źródło
0
    $ 150.00
    Fr. 150.00
     689.00

Przetestowałem powyżej trzech symboli walutowych. Możesz to zrobić także dla innych.

    var price = Fr. 150.00;
    var priceFloat = price.replace(/[^\d\.]/g, '');

Powyższe wyrażenie regularne usunie wszystko, co nie jest cyfrą ani kropką, więc ciąg znaków można uzyskać bez symbolu waluty, ale w przypadku „150,00 Fr”, jeśli pocieszysz dane wyjściowe, otrzymasz cenę jako

    console.log('priceFloat : '+priceFloat);

    output will be like  priceFloat : .150.00

co jest złe, więc sprawdź indeks „.” następnie podziel to i uzyskaj odpowiedni wynik.

    if (priceFloat.indexOf('.') == 0) {
            priceFloat = parseFloat(priceFloat.split('.')[1]);
    }else{
            priceFloat = parseFloat(priceFloat);
    }
Jyotiranjan
źródło
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;
}
Santosh Bharadwaj
źródło
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;
} 
Vladislav Kostenko
źródło
0

Ta funkcja powinna działać niezależnie od ustawień regionalnych i walutowych:

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('.');
}

Zakłada się, że znasz znak kropki dziesiętnej (w moim przypadku ustawienia regionalne są ustawiane z PHP, więc rozumiem to <?php echo cms_function_to_get_decimal_point(); ?>).

Skippy le Grand Gourou
źródło
0

To zadziałało dla mnie i obejmuje większość skrzynek :)

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
źródło