uni-app Android平台无法格式化数字值,因为Intl.NumberFormat不受支持

发布于 1周前 作者 nodeper 来自 Uni-App

uni-app Android平台无法格式化数字值,因为Intl.NumberFormat不受支持

开发环境 版本号 项目创建方式
Windows 11 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.98

手机系统:Android

手机系统版本号:Android 12

手机厂商:模拟器

手机机型:wsl

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX

### 示例代码:

```javascript
const number = 123456.789  
console.log(
new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(
number
)
)

操作步骤:

const number = 123456.789  
console.log(
new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(
number
)
)

预期结果:

// expected output: "123.456,79 €"

实际结果:

16:59:08.027 [intlify] Cannot format a number value due to not supported Intl.NumberFormat.

bug描述:

vue3 i18n 9.x 格式化货币报错


1 回复

uni-app 中,如果你在 Android 平台上遇到 Intl.NumberFormat 不受支持的问题,可能是因为某些 Android 设备或版本的浏览器环境不支持 Intl.NumberFormat API。Intl.NumberFormat 是 JavaScript 中用于格式化数字的 API,但在一些较旧的或特定的 Android 设备上可能不会被支持。

为了解决这个问题,你可以考虑以下几种方法:

1. 使用 Polyfill

你可以使用 Intl.NumberFormat 的 polyfill 来在不支持的环境中提供相同的功能。例如,使用 intl-numberformat 这个库。

npm install intl-numberformat

然后在你的代码中使用:

import IntlNumberFormat from 'intl-numberformat';

const formatter = new IntlNumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
});

console.log(formatter.format(123456.789)); // 输出: $123,456.79

2. 手动格式化数字

如果你不想使用 polyfill,也可以手动实现数字格式化。以下是一个简单的示例:

function formatNumber(number, locale = 'en-US', options = {}) {
  const { style = 'decimal', currency = 'USD', minimumFractionDigits = 2, maximumFractionDigits = 2 } = options;

  if (typeof Intl !== 'undefined' && Intl.NumberFormat) {
    return new Intl.NumberFormat(locale, {
      style,
      currency,
      minimumFractionDigits,
      maximumFractionDigits,
    }).format(number);
  }

  // Fallback for unsupported environments
  if (style === 'currency') {
    return `${currency} ${number.toFixed(maximumFractionDigits).replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`;
  } else {
    return number.toFixed(maximumFractionDigits).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  }
}

console.log(formatNumber(123456.789)); // 输出: 123,456.79
console.log(formatNumber(123456.789, 'en-US', { style: 'currency', currency: 'USD' })); // 输出: $123,456.79

3. 使用第三方库

你也可以使用第三方库来格式化数字,例如 Numeral.jsAccounting.js

npm install numeral

然后在你的代码中使用:

import numeral from 'numeral';

console.log(numeral(123456.789).format('$0,0.00')); // 输出: $123,456.79

4. 检查环境并降级处理

你可以在代码中检查当前环境是否支持 Intl.NumberFormat,如果不支持则使用降级处理。

if (typeof Intl !== 'undefined' && Intl.NumberFormat) {
  // 使用 Intl.NumberFormat
  const formatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
  console.log(formatter.format(123456.789)); // 输出: $123,456.79
} else {
  // 降级处理
  console.log(`$ ${(123456.789).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`); // 输出: $123,456.79
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!