我有不同的货币格式,我想将其转换为double值。例如:
2'344'334.03 => 1000000.03
我有以下解决方案,它的工作效率非常低。我正在试图找出一些正则表达方式。
decimalPlace = amount[amount.length - 3];
if (decimalPlace === '.' && amount.indexOf(',') < -1 && amount.indexOf("'") < -1) {
return amount
}
if (decimalPlace === ',' && amount.indexOf("'") < -1) {
value = amount.split('.').join('')
.replace(',', '.')
return value
}
if (decimalPlace === '.' && amount.indexOf(',') > -1) {
value = amount.split(',').join('')
return value
}
if (decimalPlace === ',' && amount.indexOf("'") > -1) {
value = amount.split("'").join('')
.replace(',', '.')
return value
}
if (decimalPlace === '.' && amount.indexOf("'") > -1) {
value = amount.split("'").join('')
return value
}
return amount
我很感激有关此问题的任何建议。
答案 0 :(得分:1)
你可能已经把它变得更加复杂了。 如果这些是唯一需要支持的格式,您可以使用如下函数:
var v1 = "1,000,000.00";
var v2 = "2'345',00";
var v3 = "2'344'334.03";
var v4 = "2,00"
function format(str){
if(str.replace(/[^,]/g, "").length === 1){ // Contains only one comma.
str = str.replace(",", ".");
}
if(str.indexOf("'")!=-1){
str = str.replace(/'/g, "").replace(",", ".");
}
return parseFloat(str.replace(/,/g, "")).toFixed(2);
}
[v1, v2, v3, v4].forEach(v => console.log(format(v)));
编辑:我只用一个逗号添加了对值的支持。
编辑2:实际上,似乎我自己犯了这个错误(使事情复杂化)。
我认为这一切都可以这么简单:
var v1 = "1,000,000.00";
var v2 = "2'345',00";
var v3 = "2'344'334.03";
var v4 = "2,00"
function format(str){
if(str.replace(/[^,]/g, "").length === 1){ // Contains only one comma.
str = str.replace(",", ".");
}
return parseFloat(str.replace(/[^0-9\.]/g, "")).toFixed(2);
}
[v1, v2, v3, v4].forEach(v => console.log(format(v)));
答案 1 :(得分:0)
我建议不要过多依赖正则表达式。我接近这个的方式分为两部分。
首先,弄清楚小数点是什么。这将根据区域设置进行更改,但它很容易解决 - 只需创建一个函数,它将添加一个本地化的小数点,然后返回它。
function getDecimalPoint(locale) {
return (1.2).toLocaleString(locale).replace(/\d+/g, "");
}
此功能的好处是,如果你传入没有locale
,将使用当前的一个(对我来说是“en-GB”)。
现在您可以识别小数点,您可以使用它将格式化的数字拆分为2个部分 - 甚至小数点前的整数(整数)和其后的所有内容(小数)。
function unformatNumber(number, locale) {
// Split the number based on the decimal point.
var numberParts = String(number).split(getDecimalPoint(locale));
// Remove everything that isn't a number from the whole numbers and parse
// it as a number.
var unformatted = Number(numberParts[0].replace(/\D+/g, ""));
// Check to see if there are any decimals. If there are, convert them into
// a decimal and add them to the unformatted result.
var decimals = numberParts[1];
if (decimals && decimals.length) {
unformatted += decimals / Math.pow(10, decimals.length);
}
return unformatted;
}
要使用它,只需将您的号码传递给该功能。
unformatNumber("1,000,000.00"); // -> 1000000
unformatNumber("2'345',00", "fr"); // -> 2345
unformatNumber("2'344'334.03"); // -> 2344344.03
// I know those numbers aren't formatted in French, but you can change your
// format as necessary.
function getDecimalPoint(locale) {
return (1.2).toLocaleString(locale).replace(/\d+/g, "");
}
function unformatNumber(number, locale) {
var numberParts = String(number).split(getDecimalPoint(locale));
var unformatted = Number(numberParts[0].replace(/\D+/g, ""));
var decimals = numberParts[1];
if (decimals && decimals.length) {
unformatted += decimals / Math.pow(10, decimals.length);
}
return unformatted;
}
console.log(unformatNumber("1,000,000.00"));
console.log(unformatNumber("2'345',00", "fr"));
console.log(unformatNumber("2'344'334.03"));