有没有办法在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个位置的数字支持每四位数字分隔的语言
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中的数字