2009-11-11 14 views
5

Czy jest wbudowana funkcja JavaScript, aby przekonwertować ciąg znaków na format waluty?Konwersja do formatu waluty

Na przykład

var a = '1234'; 
a.convertToCurrency(); // return $1,234 

UPDATE

Należy pamiętać, że chcę funkcja powrotu do waluty amerykańskiej obejmują przecinka do cyfr grupowych.

+0

FWIW tam jest teraz wbudowany w funkcji w JavaScript, który robi to: https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/NumberFormat, który działa również w węźle - od 0.12 – Simon

Odpowiedz

4
var a = 1234.12; 
var c = '$' + a.toLocaleString(); 
+1

To nie dodaje się w "," (przecinki) – TimH

+0

Twój przykład zwraca 1234.12 $, ale chcę, żeby zwrócił 1,234 – TimH

+0

Niestety to zależy od twojego Ustawienia systemowe. – ChaosPandion

0

To zrobiliśmy w jednym z naszych długich projektów. Po prostu znajduję kod. Nasza aplikacja była w asp.net. Funkcja dollarAmount działa

function checkNum(data) {  // checks if all characters 
     var valid = ".";  // are valid numbers or a "." 
     var ok = 1; var checktemp; 
     for (var i=0; i<data.length; i++) { 
     checktemp = "" + data.substring(i, i+1); 
     if (valid.indexOf(checktemp) == "-1") return 0; } 
     return 1; 
    } 

    function dollarAmount(form, field, appendZero) 
    { 
     Num = "" + eval("document." + form + "." + field + ".value"); 

     if(Num=="") 
     { 
      eval("document." + form + "." + field + ".value = '" + 0 + "';"); 
      return; 
     } 

     dec = Num.indexOf("."); 

     end = ((dec > -1) ? "" + Num.substring(dec,Num.length) : ""); 

     Num = "" + parseInt(Num); 

     var temp1 = ""; 
     var temp2 = ""; 
     //var appendZero=1; 

     if (checkNum(Num) == 0) { 
     //alert("This does not appear to be a valid number. Please try again."); 
     } 
     else { 

      if(appendZero==1 || end !="") 
      { 
       if (end.length == 2) end += "0"; 
       if (end.length == 1) end += "00"; 
       if (end == "") end += ".00"; 
      } 

     var count = 0; 
     for (var k = Num.length-1; k >= 0; k--) { 
     var oneChar = Num.charAt(k); 
     if (count == 3) { 
     temp1 += ","; 
     temp1 += oneChar; 
     count = 1; 
     continue; 
     } 
     else { 
     temp1 += oneChar; 
     count ++; 
     } 
     } 
     for (var k = temp1.length-1; k >= 0; k--) { 
     var oneChar = temp1.charAt(k); 
     temp2 += oneChar; 
     } 
     temp2 = temp2 + end; 
     eval("document." + form + "." + field + ".value = '" + temp2 + "';"); 
     } 
    } 

Nazwaliśmy tę funkcję jak ten

txtBox.Attributes.Add("OnBlur", "return DollarAmount('" + txtBox.ID + "',0)"); 

Również po googlowania znalazłem ten łączy

) Use JavaScript to Format Currency within Your Web Page

b) Currency Format

Także myślę, że może mieć jakieś jQuery plugin służący Currency: an unobstrusive automatic and real time currency conversion

Ale wątpię, czy którykolwiek wbudowana funkcja jest dostępna w języku JavaScript. Daj mi znać, jeśli znalazłeś. Chciałbym wiedzieć.

Dzięki.

+0

Nie ma potrzeby używania eval .... document.forms [nazwa_formularza] [nazwa pola] .value – ChaosPandion

14

zdecydowałem się całkowicie przepisać przykład zrobiłem w 2009 jeżeli zainteresowany w starszej wersji Proszę sprawdzić diff. Aby uzyskać funkcjonalność, taką jak poprzednia odpowiedź, wyodrębniłem część biblioteki Money, nad którą pracuję.

Ja też nie pamiętam, dlaczego ostatnio odtwarzałem toFixed, ponieważ ta metoda była już dostępna. Tym razem nie jest wliczony w cenę.

Zamiast niepożądanym String i Number obiektów w javascript, jak ostatnim razem, tworzę nową, Money, obiektu.

(function() { 
    window.Money = (function() { 

    Money.prototype.amount = 0.0; 
    Money.prototype.fraction_count = 2; 
    Money.prototype.fraction_separator = ","; 
    Money.prototype.separate_thousands = true; 
    Money.prototype.symbol = "€"; 
    Money.prototype.symbol_position = "front"; 
    Money.prototype.symbol_spacing = false; 
    Money.prototype.thousands_separator = "."; 

    function Money(amount, options) { 
     var o; 
     if (options == null) { 
     options = {}; 
     } 
     for (o in options) { 
     this[o] = options[o]; 
     } 
     amount = parseFloat(amount); 
     if (!isNaN(amount)) { 
     this.amount = amount; 
     } 
     this.format(); 
    } 

    Money.prototype.format = function() { 
     this.string_amount = this.amount.toFixed(this.fraction_count); 
     if (this.separate_thousands) { 
     this.string_amount = this.separateThousands(); 
     } 
     return this.string = this.addSymbol(); 
    }; 

    Money.prototype.separateThousands = function() { 
     var after_dot, before_dot, pattern, _ref; 
     _ref = this.string_amount.split("."), before_dot = _ref[0], after_dot = _ref[1]; 
     pattern = /(-?\d+)(\d{3})/; 
     while (pattern.test(before_dot)) { 
     before_dot = before_dot.replace(pattern, "$1" + this.thousands_separator + "$2"); 
     } 
     return [before_dot, after_dot].join(this.fraction_separator); 
    }; 

    Money.prototype.addSymbol = function() { 
     var string; 
     string = [this.string_amount]; 
     string.splice((this.symbol_position === "front" ? 0 : 1), 0, this.symbol); 
     return string.join(this.symbol_spacing ? " " : ""); 
    }; 

    return Money; 

    })(); 

Teraz trzeba zmodyfikować Number i/lub String obiektów lekko i dodać toMoney metody.

Number.prototype.toMoney = function(options) { 
    return new Money(this, options); 
}; 

String.prototype.toMoney = function(options) { 
    return new Money(this, options); 
}; 

więc wreszcie możemy przekształcić String i/lub Number do Money i zapisać go jako String ponownie.

x = "1234567890.0987654321".toMoney(); 
y = 1234567890.0987654321.toMoney({fraction_count: 5, symbol: "$", symbol_position: "back"}); 

console.log(x); 
// Money {amount: 1234567890.0987654, string_amount: "1.234.567.890,10", string: "€1.234.567.890,10"} 

console.log(x.string) 
// €1.234.567.890,10 

console.log(y); 
// Money {fraction_count: 5, symbol: "$", symbol_position: "back", amount: 1234567890.0987654, string_amount: "1.234.567.890,09877"…} 

console.log(y.string) 
// 1.234.567.890,09877$ 

Myślę, że to rozwiązanie jest znacznie lepsze niż ostatnie, które napisałem. Dla przykładu roboczego sprawdź jsFiddle.

+0

Wygląda na to, że masz błąd: 0.5 formaty jako "0.5", a nie "0.50" (waluta musi wynosić 2 miejsca dziesiętne) nie jeden) –

+1

Naprawiłem miejsce ułamka, jeśli dziesiętnie nie ma wystarczającej liczby miejsc. ** Zmiana: ** '$ A.arr [1] == niezdefiniowana? $ A._dec = $ O.use_fractions.fraction_separator + "0" .times ($ O.use_fractions.fractions): $ A._dec = $ O.use_fractions.fraction_separator + $ A.arr [1]; ' * * Do: ** '$ A.arr [1] == undefined? $ A._dec = $ O.use_fractions.fraction_separator + "0" .times ($ O.use_fractions.fractions): $ A._dec = $ O.use_fractions.fraction_separator + $ A.arr [1] + "0". razy ($ O.use_fractions.fractions - $ A.arr [1] .length); ' –

+0

Zrobiłem mały przepis, myślę, że ta wersja jest lepsza. – Krule

1

Wydaje się, że trzeba dużo pracy, aby przetworzyć ciąg znaków i dowiedzieć się, gdzie umieścić przecinki.

Oto mały skrypt ułożyła dziś rano, że załatwi dla liczb całkowitych:

Wywołać numberToCurrency funkcja i przekazać swoją wartość jako (ilość) i będzie można umieścić przecinki tam, gdzie powinny.

<!DOCTYPE html> 
<head> 
<meta charset="utf-8"> 
<title>Number to Money Conversion</title> 
<script> 
    function numberToCurrency(amount) { 

     var thousandsSeparator = "," 
     var currencyNum = ""; 
     var amountString = amount.toString(); 
     var digits = amountString.split(""); 

     var countDigits = digits.length; 
     var revDigits = digits.reverse(); 

     for(var i=0; i<countDigits; i++) { 
      if ((i%3 == 0) && (i !=0)) { 
       currencyNum += thousandsSeparator+revDigits[i]; 
      } else { 
       currencyNum += digits[i]; 
      } 
     }; 

     var revCurrency = currencyNum.split("").reverse().join(""); 

     var finalCurrency = "$"+revCurrency; 

     return finalCurrency; 
    } 
</script> 
</head> 
<body> 

<script> 
document.write(numberToCurrency('1238868934324')); 
</script> 


</body> 
</html> 

Można działać w tej sprawie w pętli biorąc zmienne, jak również - Rzuciłem razem ułożone wykres słupkowy w Raphael, który ma podpowiedzi informujące sformatowane ilości dolara, zaczerpniętych z liczb prostych w tablicy, więc don "Muszą bawić się ze wszystkimi cytatami". Poza tym, że czarne tło z bąbelkami jest stopniowo niedopasowane, gdy przesuję mysz nad stosami w każdym takcie, działa całkiem nieźle - nadal ma problemy z etykietami - wydaje się, że labeliser ma problemy. To naprawdę próbna próbka, ale do przeliczania liczb na walutę wystarczy.

Zrobiłem też skrypt, który wykrywa centów i dodaje "0", jeśli po "." Jest tylko jedna cyfra, ale nie testowałem tego tak szeroko, i istnieje wiele różnych testów, które mogłem wykonać. wyobraź sobie, że musisz zrobić dodatkowo. Wkrótce opublikuję kopię roboczą i możesz z nią grać.

Oto co zrobiłem z Raphael: http://lifeistryingtotellyousomething.info/raphael/raphael-stacked-column-demo-2000.html

1

Oto inne podejście, które uwzględnia centów:

<!DOCTYPE html> 
<head> 
<meta charset="utf-8"> 
<title>Money Conversion</title> 

<script type="text/javascript"> 
function numberToCurrency(amount) { 

    var wholeDigits; 
    var thousandsSeparator = "," 
    var centSeparator = "." 
    var currencyNum = ""; 

    if(amount.indexOf(".") != -1) { 
     var hasCents = true; 
    } else { 
     var hasCents = false; 
    } 

    if (hasCents == true) { 
     var num = amount.split("."); 
     var wholeDigits = num[0].split(""); 
     var centAmount = num[1]; 
     var centDigits = num[1].split(""); 

     if (centDigits.length == 0) { 
      centDigits += "00"; 
     } 
     if ((centDigits.length > 0) && (centDigits.length < 2)) { 
      centDigits += "0"; 
     } 

    } else { 
     centDigits = ""; 
     centSeparator = ""; 
     wholeDigits = amount.split(""); 
    } 

    var countDigits = wholeDigits.length; 

    var revDigits = wholeDigits.reverse(); 

    for(var i=0; i<countDigits; i++) { 
      if ((i%3 == 0) && (i !=0)) { 
       currencyNum += thousandsSeparator+revDigits[i]; 
      } else { 
       currencyNum += wholeDigits[i]; 
      } 
    }; 

    var revCurrency = currencyNum.split("").reverse().join(""); 

    var finalCurrency = "$"+revCurrency+centSeparator+centAmount; 

    return finalCurrency; 
} 
</script> 

</head> 
<body> 


<script type="text/javascript"> 

document.write(numberToCurrency('12326563523.37')); 

</script> 

</body> 
</html> 

To załatwia sprawę, choć nie okrągły kwoty cent lub taśmy off dodatki przeszłość 2 cyfry.

0

Chociaż jest to stary post. Niemniej jednak, ten pracował dla mnie w moim własnym przypadku:

var a = parseInt("1234"); 
console.log("$"+number_format(a)); 

var number_format = function(total) { 
    return total.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,'); 
}; 
Powiązane problemy