react-native .toLocaleString()不适用于android

EQu*_*per 15 react-native

我正在使用.toLocaleString()react-native来获取我的数字输出.所有关于IOS的工作但似乎不适用于Android.这是正常的还是?我需要使用小数函数吗?

在此输入图像描述

Tay*_*son 38

与其使用 polyfill 或外部依赖项,不如更改您的 android 应用程序构建的 JSC。对于较新版本的react-native添加或覆盖以下行app/build.gradle

def jscFlavor = 'org.webkit:android-jsc-intl:+'
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这也是最完整、最灵活的答案,因为它为 JavaScript Core 添加了对国际化的支持。请记住,此运行时比其对应的运行时稍大(约 6MB)。 (4认同)

Tam*_*bia 12

您可以使用

number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
Run Code Online (Sandbox Code Playgroud)

  • 这是可耻的. (53认同)
  • 当您使用本地化以及尝试格式化货币金额时,不会有帮助。 (9认同)
  • 这似乎在小数点后添加逗号,这是不可取的。`0.0123` 变为 `0.0,123` (2认同)

Dan*_*ash 11

这是用于在 Android 中运行 react native 的 Javascript 核心的问题,而不是 react native 本身的问题。为了克服这个问题,您必须将最新的 javascript 核心集成到您的 android 构建中或将 react native 升级到 0.59。

详细信息记录在JSC Android Buildscripts 存储库中。

现在,对于想要在不需要集成整个 javascript 核心的情况下进行语言环境字符串格式化的人来说,Javascript 具有国际化 API,可让您将数字格式化为语言敏感格式。MDN提供的文档

此 API 在 android 中不可用,需要使用Intl进行 polyfill

在您的项目根目录中,安装 Intl 库

yarn add intl
Run Code Online (Sandbox Code Playgroud)

然后在您项目的索引文件 (index.js) 中,在文件顶部添加以下代码:

if(Platform.OS === 'android') { // only android needs polyfill
  require('intl'); // import intl object
  require('intl/locale-data/jsonp/en-IN'); // load the required locale details
}
Run Code Online (Sandbox Code Playgroud)

完成上述两个步骤后,您现在可以使用

new Intl.NumberFormat('en-IN', { style: 'currency', currency: 'INR' }).format(10000000);
Run Code Online (Sandbox Code Playgroud)

如果您需要为另一个区域设置代码格式化数字,所有区域设置代码详细信息都可以在intl/locale-data/jsonp/目录下找到。只需在 index.js 文件中添加您需要的内容即可。


Isa*_*run 8

在较新版本的 RN 上,>0.62您可以更改 JSC (JavaScriptCore) 构建变体以支持/包含ICU i18n库和允许使用的必要数据,例如Date.toLocaleStringString.localeCompare

替换android/app/build.gradle文件中的这一行

def jscFlavor = 'org.webkit:android-jsc:+'
Run Code Online (Sandbox Code Playgroud)

用这条线

def jscFlavor = 'org.webkit:android-jsc-intl:+'
Run Code Online (Sandbox Code Playgroud)

清洁构建和 react-native run android

笔记

此变体每个架构比默认值大约 6MiB。因此,如果使用每个 APK 架构构建,预计您的 APK 大小会增加约 4MB,如果def enableSeparateBuildPerCPUArchitecture = true禁用每个架构的单独构建,则 APK 会更大


Seb*_*ski 6

这样做的原因是 react-native 使用的 JavaScriptCore 版本非常旧。iOS 嵌入了自己的版本,这就是它在那里运行良好的原因。

问题仍然存在(一些关于它前进方向的阅读https://github.com/facebook/react-native/issues/19737

来自 Airbnb 开发人员的更多信息 https://medium.com/airbnb-engineering/react-native-at-airbnb-the-technology-dafd0b43838(搜索“JavaScriptCore 不一致”)