NodeJS 非ascii字符串,如何确定它们的编码,如何提取字符并转换为ascii表示?

oxiaedzo  于 2023-02-12  发布在  Node.js
关注(0)|答案(1)|浏览(234)

我正在做一些与 NodeJS 和 puppet 师网页抓取。
返回给我的一些数据如下所示:

{
    "priceValue": "£20,000"
}

由于第一个字符的原因,该字符串显然不是ASCII字符串。

  • 我如何确定这个字符串的编码/表示和字符宽度?

我想根据第一个字符做一个逻辑判断,我想从这个字符串中提取数值,并给返回的对象赋一个"priceCurrency": "GBP"值。
要做到这一点,最合乎逻辑的方法是获取第一个“字符”,并使用if语句处理它。

  • 我如何从这个字符串中提取第一个字符,然后将它与if语句中的某个值进行比较?
  • 如何将剩余的字符串内容转换为ascii?
umuewwlo

umuewwlo1#

前言

下面的回答考虑了OP提出的这个(目前已关闭)随访问题...... "How to process price / currency strings in a database safe way?"
为了绕过OP的ASCII限制,所有货币符号/字符都以unicode转义形式提供,但仅在必要时提供。

方法/解决方案

除了已经提供的另一线程的解决方案之外,还有另一种可能的实现,其使用Map示例以获得更好的查找性能,其中货币值确实用作(查找)密钥。
解析为货币部分和尚未完全验证的数字部分是基于一个正则表达式,该正则表达式部分地利用了unicode转义的Symbol类别以及命名捕获组和alternation,后者支持两种成本-价值变量,即...

  • 前导货币值和尾随数字值
  • 或者前导数字值和尾随货币值。

模式如下...

/^(?<currency_before>[A-Z]{3}|(?:(?:[A-Z]{2}\s*)?\p{S}))\s*(?<value_after>[\d.,]+)|(?<value_before>[\d.,]+)\s*(?<currency_after>[A-Z]{3}|(?:(?:[A-Z]{2}\s*)?\p{S}))$/u

...并得到described at the related test-page
以前更严格的模式专门针对货币符号,看起来像这样...

/(?<symbol_before>\p{S})\s*(?<value_after>[\d.,]+)|(?<value_before>[\d.,]+)\s*(?<symbol_after>\p{S})/u

...并得到described at its related test-page
潜在的数字值可以用逗号作为千位分隔符和一个可选的点作为小数点,或者用一个点作为千位分隔符和一个可选的逗号作为小数点(例如德国的方式)。

/^(?:(?<integer>\d+$)|(?<dot_surrogate>(\d+)?[.,]\d+$)|(?<thousands_dot>\d{1,3}\.(?:\d{3}[.,])+\d+$)|(?<thousands_comma>\d{1,3},(?:\d{3}[.,])+\d+$))/

...其中description can be read at its related test-page.

示例代码

一个三个三个一个

相关问题