不要使用polyfill或外部依赖,改变您的Android应用构建时所使用的JSC。对于较新版本的react-native
,请在app/build.gradle
中添加或覆盖以下行:
def jscFlavor = 'org.webkit:android-jsc-intl:+'
yarn add jsc-android
后才对我起作用。 - rcorrie在新版本的 RN >0.62
上,您可以更改 JSC(JavaScriptCore)构建变体,以支持/包含 ICU i18n 库和必要数据,从而可以使用例如 Date.toLocaleString
和 String.localeCompare
请在您的 android/app/build.gradle
文件中替换此行
def jscFlavor = 'org.webkit:android-jsc:+'
使用这行代码
def jscFlavor = 'org.webkit:android-jsc-intl:+'
清理构建并运行react-native run android
这个变体比默认设置多约6MiB。因此,如果使用def enableSeparateBuildPerCPUArchitecture = true
并且对每个APK架构进行单独构建,则每个APK架构的构建都将导致APK大小增加约4MB,并且如果禁用每个架构的单独构建,则APK更大。
number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
0.0123
变成了 0.0,123
。 - Zackapp/build.gradle
,所以我使用了这个解决方案。为了解决@Zack指出的问题,该方法检查小数点number.toString().indexOf('.') > 1
,如果存在,则进行拆分const numberParts = number.toString().split(/\./);
。然后将正则表达式应用于numberParts[0]
,然后附加'.' + numberParts[1]
。如果没有小数,则直接将正则表达式应用于number
。 - knot22yarn add intl
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
}
new Intl.NumberFormat('en-IN', { style: 'currency', currency: 'INR' }).format(10000000);
intl/locale-data/jsonp/
目录下找到。只需在您的 index.js 文件中引用您需要的代码即可。(value) => {
if (typeof value === 'number') {
const [currency, cents] = (value / 100).toFixed(2).toString().split('.');
return `${currency.replace(/\B(?=(\d{3})+(?!\d))/g, '.')},${cents}`;
}
return '0,00';
}
这是一个更加新的和轻量级的版本,请查看
yarn add @formatjs/intl-getcanonicallocales @formatjs/intl-locale @formatjs/intl-pluralrules @formatjs/intl-numberformat
import {shouldPolyfill} from '@formatjs/intl-numberformat/should-polyfill'
if (shouldPolyfill()) {
require('@formatjs/intl-getcanonicallocales/polyfill');
require('@formatjs/intl-locale/polyfill');
require('@formatjs/intl-pluralrules/polyfill');
require('@formatjs/intl-numberformat/polyfill');
require('@formatjs/intl-numberformat/locale-data/en-US');
}
解决方法:1
前往android/app/build.gradle
将此行替换为def jscFlavor = 'org.webkit:android-jsc-intl:+'
停止Metro并重新构建您的应用程序。
解决方法:2
否则,您可以使用此软件包https://www.npmjs.com/package/luxon
import import {DateTime} from 'luxon';
const date = DateTime.fromISO(new Date().toISOString());
const formatted = date.toLocaleString(DateTime.DATETIME_MED);
console.log(formatted);
零依赖方案:
const parseCurr = (value) =>
Platform.OS === 'android'
? '$' + price.toFixed(2)
: price.toLocaleString('en-US', { style: 'currency', currency:'USD' });
parseCurr(25.75) // => $25.75
一个现实生活的例子(货币价值乘以100以获得更好的分币精度),并将其转换为巴西雷亚尔(R$)
export const getBRPrice = (price: number) => {
const parsedPrice =
( price / 100 ).toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' });
return Platform.OS === 'android'
? `R$${ ( price / 100 ).toFixed(2) }`
: parsedPrice;
};
// getBRPrice(450) => R$4,50
function numberToMoney(amount, simbol = '$', decimalCount = 2, decimal
= ".", thousands = ",") {
decimalCount = Math.abs(decimalCount)
decimalCount = isNaN(decimalCount) ? 2 : decimalCount
const negativeSign = amount < 0 ? "-" : ""
const i = parseInt(amount = Math.abs(Number(amount) ||
0).toFixed(decimalCount)).toString()
const j = (i.length > 3) ? i.length % 3 : 0
return simbol + negativeSign + (j ? i.substr(0, j) + thousands : '') +
i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ?
decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : "")
};