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

nai*_*rch 15 javascript localization internationalization

Intl.NumberFormat(见Mozilla的文档)提供了在Javascript中一个很好的方式,以数字格式转换成电流locale`s版本是这样的:

new Intl.NumberFormat().format(3400); // returns "3.400" for German locale
Run Code Online (Sandbox Code Playgroud)

但我找不到一种方法来扭转这种格式.有没有类似的东西

new Intl.NumberFormat().unformat("3.400"); // returns 3400 for German locale
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

nai*_*rch 6

我找到了一个解决方法:

var separator = new Intl.NumberFormat().format(1111).replace(/1/g, '');
"3.400".replace(new RegExp('\\' + separator, 'g'), '');
Run Code Online (Sandbox Code Playgroud)

不是最好的解决方案,但它的工作原理:-)

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

更新
这是一个完整的工作区域编号解析器,具有类似的方法.

  • 喜欢这个功能!但请注意,没有必要使用 RegEx 查找千位和小数分隔符。`Intl API` 还提供了 `formatToParts()` 函数来轻松提取分隔符符号: `const HundredSeparator = Intl.NumberFormat(i18n.language).formatToParts(11111)[1].value` `const DecimalSeparator = Intl. NumberFormat(i18n.language).formatToParts(1.1)[1].value` (5认同)

Eri*_*del 6

我刚刚使用组替换器解决了它

const exp = /^\w{0,3}\W?\s?(\d+)[.,](\d+)?,?(\d+)?$/g
const replacer = (f, group1, group2, group3) => {
return group3 ? 
            `${group1}${group2}.${group3}` : 
            `${group1}.${group2}`
}


const usd = '$10.15'.replace(exp, replacer)
// 10.15

const eu = '€01.25'.replace(exp, replacer)
// 1.25

const brl = 'R$ 14.000,32'.replace(exp, replacer)
// 14000.32

const tai = 'TAI 50.230,32'.replace(exp, replacer)
// 50230.32


// just to test!
const el = document.getElementById('output')

const reverseUSD = new Intl.NumberFormat('en-us', { style: 'currency', currency: 'USD' }).format(usd)

el.innerHTML += `<br> from: ${reverseUSD} to ${parseFloat(usd)}`

const reverseBRL = new Intl.NumberFormat('pt-br', { style: 'currency', currency: 'BRL' }).format(brl)

el.innerHTML += `<br> from: ${reverseBRL} to ${parseFloat(brl)}`

const reverseTAI = new Intl.NumberFormat('en-us', { style: 'currency', currency: 'TAI' }).format(tai)

el.innerHTML += `<br> from: ${reverseTAI} to ${parseFloat(tai)}`

const reverseEU = new Intl.NumberFormat('eur', { style: 'currency', currency: 'EUR' }).format(eu)

el.innerHTML += `<br> from: ${reverseEU} to ${parseFloat(eu)}`
Run Code Online (Sandbox Code Playgroud)
<output id=output></output>
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但有一个问题。没有小数位的数字转换会得到错误的结果。例如。“R$ 2.393”将得到“0.393”。 (2认同)

Saq*_*med 5

在这里,我为功能反转创建了一个format()函数。此功能将在所有语言环境中支持反向格式化。

function 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(new RegExp('\\' + group, 'g'), '');
        reversedVal = reversedVal.replace(new RegExp('\\' + decimal, 'g'), '.');
        return Number.isNaN(reversedVal)?0:reversedVal;
    }

console.log(reverseFormatNumber('1,234.56','en'));
console.log(reverseFormatNumber('1.234,56','de'));
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的想法,但当我们开始使用额外的区域设置和格式规则时,我们就遇到了问题。有一个名为“formatToParts”的函数,可以使用它代替 format 来提取组件。然后,您可以通过“formatToParts”函数从该数组中找到分隔符和小数点的正确值。 (2认同)