有没有办法在JavaScript中反转Intl.NumberFormat的格式

有没有办法在JavaScript中反转Intl.NumberFormat的格式,javascript,localization,internationalization,Javascript,Localization,Internationalization,Intl.NumberFormat(请参阅)在Javascript中提供了一种很好的方法,可以将数字格式化为当前语言环境的版本,如下所示: new Intl.NumberFormat().format(3400); // returns "3.400" for German locale parseLocaleNumber('3.400,5', 'de'); parseLocaleNumber('3.400,5'); // or if you have German locale settin

Intl.NumberFormat
(请参阅)在Javascript中提供了一种很好的方法,可以将数字格式化为当前语言环境的版本,如下所示:

new Intl.NumberFormat().format(3400); // returns "3.400" for German locale
parseLocaleNumber('3.400,5', 'de');
parseLocaleNumber('3.400,5'); // or if you have German locale settings
// results in: 3400.5
但我找不到一种方法来扭转这种格式。 有类似的吗

new Intl.NumberFormat().unformat("3.400"); // returns 3400 for German locale

谢谢您的帮助。

我找到了一个解决方法:

/**
 * Parse a localized number to a float.
 * @param {string} stringNumber - the localized number
 * @param {string} locale - [optional] the locale that the number is represented in. Omit this parameter to use the current locale.
 */
function parseLocaleNumber(stringNumber, locale) {
    var thousandSeparator = Intl.NumberFormat(locale).format(11111).replace(/\p{Number}/gu, '');
    var decimalSeparator = Intl.NumberFormat(locale).format(1.1).replace(/\p{Number}/gu, '');

    return parseFloat(stringNumber
        .replace(new RegExp('\\' + thousandSeparator, 'g'), '')
        .replace(new RegExp('\\' + decimalSeparator), '.')
    );
}
像这样使用它:

new Intl.NumberFormat().format(3400); // returns "3.400" for German locale
parseLocaleNumber('3.400,5', 'de');
parseLocaleNumber('3.400,5'); // or if you have German locale settings
// results in: 3400.5
这不是最好的解决方案,但很有效:-)

如果有人知道实现这一点的更好方法,请随时发布您的答案

更新

  • 包装在一个完整的可重用函数中
  • 使用regex类
    \p{Number}
    提取分隔符。因此,它也适用于非阿拉伯数字
  • 使用带5个位置的数字支持每四位数字分隔的语言

到目前为止,我所做的是一个多步骤的方法,您可以在下面的代码中看到nf是数字格式服务。此函数接受格式化的数字以及使用的区域设置。现在我们通过将10k除以3来创建一个比较器,从而保证在固定位置上有一个十进制和千位分隔符。然后删除千位分隔符和所有其他非数字符号,如货币符号。之后,我们将十进制分隔符替换为英文分隔符,最后返回一个铸造的数字

  uf(number, locale) {
    let nf = this.nf({}, locale);
    let comparer = nf.format(10000 / 3);

    let thousandSeparator = comparer[1];
    let decimalSeparator = comparer[5];

    // remove thousand seperator
    let result = number.replace(thousandSeparator, '')
    // remove non-numeric signs except -> , .
      .replace(/[^\d.,-]/g, '')
    // replace original decimalSeparator with english one
      .replace(decimalSeparator, '.');

    // return real number
    return Number(result);
  }

在这里,我创建了一个与
format()
函数相反的函数。 此函数将支持所有地区的反向格式设置

函数reverseFormatNumber(val,locale){
var group=new Intl.NumberFormat(locale).format(1111).replace(/1/g');
var decimal=new Intl.NumberFormat(locale).format(1.1).replace(/1/g');
var reversedVal=val.replace(新的RegExp('\\'+组'g'),'';
reversedVal=reversedVal.replace(新的RegExp('\\'+十进制'g'),'.');
返回编号.isNaN(reversedVal)?0:reversedVal;
}
log(reverseFormatNumber('1234.56','en');

日志(反向格式编号('1.234,56','de')不确定这种方法在性能方面的相关性,但有几个选项总是好的,因此这里有另一个选项:

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('.');
}
函数getNumPrice(价格,小数点){
var p=价格分割(分点);

对于(var i=0;i您应该能够使用:

value.replace(/\D/g, '');

因为任何添加的格式都将是非数字的

不是很干净,但对我来说很有用:

//value is "in-En" format --> $1,200.51
function unformatter(value){
    value = value.replace("$","");
    value = value.replace(",","");
    value = parseFloat(value);
    return(value); //returns --> 1200.51
};

我刚刚用组替换器解决了这个问题

const exp=/^\w{0,3}\w?\s?(\d+)[,](\d+),(\d+)$/g
常量替换=(f,组1,组2,组3)=>{
返回组3?
`${group1}${group2}.${group3}`:
`${group1}.${group2}`
}
常数usd='10.15'。替换(exp,replace)
// 10.15
常数eu='01.25欧元'。替换(exp,replace)
// 1.25
常量brl='R$14.000,32'。替换(exp,replace)
// 14000.32
const tai='tai 50.230,32'。替换(exp,replacer)
// 50230.32
//只是为了测试!
const el=document.getElementById('output')
const reverseeusd=new Intl.NumberFormat('en-us',{style:'currency',currency:'USD'})。格式(USD)
el.innerHTML+=`
从:${reverseeusd}到${parseFloat(usd)}` const reverseBRL=new Intl.NumberFormat('pt-br',{style:'currency',currency:'BRL'})。格式(BRL) el.innerHTML+=`
从:${reverseBRL}到${parseFloat(brl)}` const reverseTAI=new Intl.NumberFormat('en-us',{style:'currency',currency:'TAI'})。格式(TAI) el.innerHTML+=`
从:${reverseTAI}到${parseFloat(tai)}` const reverseEU=new Intl.NumberFormat('eur',{style:'currency',currency:'eur'})。格式(eu) el.innerHTML+=`
从:${reverseEU}到${parseFloat(eu)}`

如何使用数学?看看:

const usd='$204.201,32'
const brl='R$14.000,32'
常量stringToDecimal=(string='')=>Number(string.replace(/\D/g')/100
const usdToDecimal=stringToDecimal(usd)//输出:usd到十进制:204201.32

常量brlToDecimal=stringToDecimal(brl)//输出:BRL To Decimal:14000.32
您可以在返回强制转换为数字之前添加一个
+
符号。执行此操作时,我通常希望将其转换为数值工具以查看函数!不过请注意,不必使用正则表达式查找千位和十进制分隔符。
Intl API
还提供了
格式ToParts()
函数可轻松提取分隔符符号:
常量千位分隔符=Intl.NumberFormat(i18n.language).formatParts(11111)[1]。value
常量小数分隔符=Intl.NumberFormat(i18n.language)。formatParts(1.1)[1].value
有一个小问题:您必须替换所有分隔符,因此您必须使用
let-thounandseparator=new RegExp('\\'+comparer[1],'g');
不,这不适用于十进制数:
“10.05”。替换(/\D/g',)
=>
“1005”
啊,我只是想用整数而不是浮点数。你是对的,如果你需要小数,那么它就不起作用了。看,我刚刚更新了我的答案,它也适用于那些场景stackoverflow.com/a/65568607/4087199这是个正确的想法,但我们一开始使用其他地区和格式规则就遇到了问题。好了这是一个名为
formatToParts
的函数,可以用来代替format来提取组件。然后,您可以从
formatToParts
函数中从该数组中找到分隔符和小数点的正确值。@JohnLeidegren这看起来怎么样?@OliverJosephAsh是的,看得差不多。请记住并非所有的p艺术将一直存在。只有千分之一的数字才有千分之一的分隔符,只有十进制数字才有小数点。你试过
stringToDecimal('3.400')吗
?结果是“34”。这不是我所期望的。是的。这确实是一个问题。所以你可以这样做,但如果是currenct符号,你需要删除该.Number('3.400'。替换(/\./g',)。替换(/\,/g',))我的问题是关于解析a中的数字