Javascript Intl.NumberFormat问题:动态配置参数为何无法生效?
问题原因及解决方案
核心问题在于:你传给Intl.NumberFormat的第二个参数是一个JSON字符串,但它实际需要的是一个JavaScript对象。
为什么硬编码时能正常运行?
当你硬写{ style: 'currency', currency: 'GBP', ... }的时候,这是一个原生的JS对象,Intl.NumberFormat可以直接识别并使用其中的配置项。但你的代码里把配置拼成了模板字符串,最终得到的是一个字符串类型的值,而不是对象——Intl.NumberFormat无法解析字符串格式的配置,自然就不能正常工作了。
另外,你拼出来的字符串甚至不是合法的JSON:JSON要求所有键必须用双引号包裹,而你的模板字符串里用的是单引号(甚至没加引号),这会导致即使你尝试解析它也会失败。
正确的写法:直接使用JS对象
你完全不需要把配置转成字符串,直接创建一个包含变量的JS对象即可,这样既能动态替换locale和currency,又符合API的要求:
<html> <body> <script> const currency = 'GBP'; const locale = 'en-GB'; // 直接定义配置对象,动态插入变量 const formatOptions = { style: 'currency', currency: currency, // ES6+ 可以简写为 currency minimumFractionDigits: 0, maximumFractionDigits: 0 }; console.log(formatOptions); const cf = new Intl.NumberFormat(locale, formatOptions); document.write(cf.format(1887732.233) + "<br>"); </script> </body> </html>
(可选)如果非要用字符串转对象的方式(不推荐)
如果你因为某些原因必须用字符串来生成配置,那需要先拼成合法的JSON,再用JSON.parse()转成对象:
<html> <body> <script> const currency = 'GBP'; const locale = 'en-GB'; // 注意键必须用双引号,这才是合法的JSON格式 const jsonStr = `{ "style": "currency", "currency": "${currency}", "minimumFractionDigits": 0, "maximumFractionDigits": 0 }`; console.log(jsonStr); const formatOptions = JSON.parse(jsonStr); const cf = new Intl.NumberFormat(locale, formatOptions); document.write(cf.format(1887732.233) + "<br>"); </script> </body> </html>
这种方式多了一层解析步骤,不如直接用对象简洁,所以更推荐第一种写法。
内容的提问来源于stack exchange,提问作者jbd
相关产品推荐
相关产品推荐

