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

时间:2015-03-25 12:35:24

标签: javascript localization internationalization

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

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

但我无法找到扭转这种格式的方法。 有什么像

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

感谢您的帮助。

8 个答案:

答案 0 :(得分:7)

我找到了一个解决方法:

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

不是最好的解决方案,但它有效: - )

如果有人知道更好的方法,请随时发布您的答案。

<强>更新
Here's具有类似方法的完整工作区域设置编号解析器。

答案 1 :(得分:5)

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

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)}`
<output id=output></output>

答案 2 :(得分:1)

到目前为止我所做的是一个多步骤的方法,你可以在下面的代码中看到。 nf 是NumberFormat服务。此函数采用格式化的数字以及使用的区域设置。现在我们通过将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);
  }

答案 3 :(得分:1)

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

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'));

答案 4 :(得分:0)

不确定这种方法在性能方面是否相关,但是总是有几种选择总是很好的,所以这里是另一种选择:

org.pdfclown.files.File file = new org.pdfclown.files.File();
Document document = file.Document;
Page page = new Page(document);
document.Pages.Add(page);

new Polyline(page, page.Box, "Test-PolyLine")
{
    Color = new DeviceRGBColor(1, 0, 0),
    Vertices = new List<PointF>() { new PointF(50, 50), new PointF(50, 250), new PointF(150, 150), new PointF(250, 250), new PointF(250, 50) }
};

file.Save("PolyLine-PdfClown.pdf", SerializationModeEnum.Standard);

在我的情况下,语言环境是从PHP设置的,因此我可以通过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('.'); } 来获得它,但是显然可以使用其他答案中建议的除法技巧。

答案 5 :(得分:0)

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

//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
};

答案 6 :(得分:0)

使用数学怎么样?看一看:

const usd = '$204.201,32'
const brl = 'R$ 14.000,32'

const stringToDecimal = (string = '') => Number(string.replace(/\D/g, '')) / 100
const usdToDecimal = stringToDecimal(usd) // outputs: USD To Decimal: 204201.32

const brlToDecimal = stringToDecimal(brl) // outputs: BRL To Decimal: 14000.32

答案 7 :(得分:-1)

您应该可以使用:

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

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