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.

Odpowiedzi:


480

Usuń wszystkie kropki / cyfry:

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

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


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;

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.


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.


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,


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


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$")



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

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

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.