J'ai une zone de texte qui aura une chaîne currency dans lequel je dois ensuite convertir cette chaîne en double pour effectuer certaines opérations dessus.
"$1,100.00"
→ 1100.00
Cela doit se produire tout côté client. Je n'ai d'autre choix que de laisser la chaîne currency sous la forme d'une chaîne currency mais il faut la convertir/la convertir en double pour permettre certaines opérations mathématiques.
Supprimer tous les points/chiffres:
var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
accounting.js est la voie à suivre. Je l'ai utilisé lors d'un projet et j'ai eu une très bonne expérience.
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000
Vous pouvez le trouver sur GitHub
Utilisez une expression régulière pour supprimer le formatage (dollar et virgule), et utilisez parseFloat pour convertir la chaîne en nombre à virgule flottante.
var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
Je sais que c'est une vieille question, mais je voulais donner une option supplémentaire.
JQuery Globalize permet d'analyser un format spécifique à une culture en un flottant.
https://github.com/jquery/globalize
Avec la chaîne "$ 13,042.00" et Globalize défini sur en-US:
Globalize.culture("en-US");
Vous pouvez analyser la valeur float comme ceci:
var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));
Cela vous donnera:
13042.00
Et vous permet de travailler avec d'autres cultures.
Cet exemple fonctionne bien
var currency = "$123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
alert(number);
Je sais que c’est une vieille question, mais la réponse de CMS semble avoir un petit défaut: cela ne fonctionne que si le format monétaire utilise "." comme séparateur décimal . Par exemple, si vous devez travailler avec des roubles russes, la chaîne ressemblera à ceci: "1 000,00 rub."
Ma solution est beaucoup moins élégante que celle des CMS, mais elle devrait faire l'affaire.
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'));
Hypothèses:
L’expression rationnelle peut même traiter quelque chose comme «1 999 dollars et 99 cents», bien qu’il ne s’agisse pas d’une fonctionnalité voulue et ne doit pas être invoquée.
J'espère que cela aidera quelqu'un.
Je sais que vous avez trouvé une solution à votre question. Je voulais simplement vous recommander de regarder le plugin plus complet suivant jQuery pour les formats de nombres internationaux:
// "10.000.500,61 TL" price_to_number => 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;
}
Tu peux essayer ça
<script type="text/javascript">
var str="$1,112.12";
str = str.replace(",","");
str = str.replace("$","");
document.write(parseFloat(str));
</script>
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");
la sortie est: Rs. 39.00
use jquery.glob.js,
jQuery.glob.all.js
Cette fonction devrait fonctionner quels que soient les paramètres régionaux et monétaires:
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('.');
}
Cela suppose que vous connaissiez le caractère décimal (dans mon cas, les paramètres régionaux sont définis à partir de PHP, je l’obtiens donc avec <?php echo cms_function_to_get_decimal_point(); ?>
).
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;
}
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;
}
Ceci est ma fonction. Fonctionne avec toutes les devises.
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]/, "")
);
}
Utilisation: toFloat("$1,100.00")
ou toFloat("1,100.00$")