#react-native #expo
#react-native #expo
Вопрос:
Как мне взять число, подобное 10000
, и вывести его как $10,000.00
? У меня даже была проблема с String.format(...)
с Not a function
ошибкой.
Я следил за многочисленными статьями, все неполные и ни одна не работает. Мне не нужна полная интернационализация, просто возможность форматировать число
Комментарии:
1. В каком формате вы хотите?
2. Ответ Хуана Банзера сильно недооценен.
3. @GeorgiG Нет, это не так. Этот вопрос касается react-native, и это решение не работает должным образом в Android.
Ответ №1:
Вы можете использовать toFixed
метод для отображения 2 десятичных знаков.
let num = 1000;
console.log(num.toFixed(2)); // 1000.00
И вы можете использовать регулярное выражение следующим образом
function currencyFormat(num) {
return '$' num.toFixed(2).replace(/(d)(?=(d{3}) (?!d))/g, '$1,')
}
console.log(currencyFormat(2665)); // $2,665.00
Комментарии:
1. Второй способ не работает. Он печатает 1665, а не 2665.
2. @romin21 это работает нормально. Вы пытаетесь
Run code snippet
? В моем случае он печатает $ 2,665.003. на React Native выводится 1665. Может быть проблема с движком React Native.
4. Валюта не всегда предшествует значению, это зависит от языка
5. @ofer2980 тогда почему бы не изменить то, что вы хотите? Все очень просто, вам нужна валюта в последнюю очередь — добавьте ее в последнюю очередь.
Ответ №2:
Вы можете использовать эту библиотеку react-number-format. Он обладает следующими функциями
- Префикс, суффикс и разделитель тысяч.
- Шаблон пользовательского формата.
- Маскировка.
- Пользовательский обработчик форматирования.
- Форматируйте число во входных данных или форматируйте как простой текст
Пример использования
<NumberFormat value={2456981} displayType={'text'} thousandSeparator={true} prefix={'$'} />
Результат: $ 2,456,981
Комментарии:
1. Не забудьте добавить: renderText={значение => <Текст>{значение}</Text>} внутри
2. Этот компонент не поддерживает react native, в чем вопрос.
3. Мои данные также имели значения, подобные 20,1, и я хотел получить от этого 20,10 долларов, поэтому я объединил оба ответа и ответ @robin: <Формат номера={текст => <Текст>{текст}</Text>} значение={props.data.amount.toFixed(2)} DisplayType={‘text’} thousandSeparator={true} префикс={‘$’} />
4. Число((12331.2313).toFixed(2)).toLocaleString()
5. это не пакет React Native!!
Ответ №3:
Редактировать: Извините, это React.js решение — не React Native. У меня ничего из вышеперечисленного не сработало… но у этого парня была правильная идея / решениеhttps://medium.com/@nidhinkumar/react-js-number-format-and-styling-a1a6e211e629
const numberFormat = (value) =>
new Intl.NumberFormat('en-IN', {
style: 'currency',
currency: 'INR'
}).format(value);
numberFormat(50000); //output as ₹ 50,000.00
numberFormat(10000); //output as ₹ 10,000.00
Комментарии:
1. Можете ли вы убедиться, что это решение работает в Android? В прошлый раз, когда я использовал react native, объект «Intl» привел к сбою в моей версии Android.
2. Кому-нибудь удалось заставить это работать в React Native?
3. @AsadS /** * Предпочтительный вариант сборки JavaScriptCore. * * Например, чтобы использовать международный вариант, вы можете использовать: *
def jscFlavor = 'org.webkit:android-jsc-intl: '
* * Международный вариант включает библиотеку ICU i18n и необходимые данные, * позволяющие использовать, например,Date.toLocaleString
иString.localeCompare
которые * дают правильные результаты при использовании с локалями, отличными от en-US. Обратите внимание, что * этот вариант примерно на 6 МБ больше для каждой архитектуры, чем по умолчанию. */4. В бразильской валюте:
const numberFormat = (value) => new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(value);
Ответ №4:
Чтобы избежать использования библиотек, вы можете использовать следующий код
const defaultOptions = {
significantDigits: 2,
thousandsSeparator: ',',
decimalSeparator: '.',
symbol: '$'
}
const currencyFormatter = (value, options) => {
if (typeof value !== 'number') value = 0.0
options = { ...defaultOptions, ...options }
value = value.toFixed(options.significantDigits)
const [currency, decimal] = value.split('.')
return `${options.symbol} ${currency.replace(
/B(?=(d{3}) (?!d))/g,
options.thousandsSeparator
)}${options.decimalSeparator}${decimal}`
}
Комментарии:
1. Не распространяется, когда значащие цифры равны 0, но в остальном это работает хорошо.
Ответ №5:
Самый быстрый способ — использовать react-number-format, как указано выше, но не забывайте renderText
prop, чтобы React Native не выдавал ошибку рендеринга.
Выполните этот шаг:
- Установите. Используйте эту команду:
npm i react-number-format
- Используйте его в своем приложении React Native следующим образом:
import React from 'react';
import NumberFormat from 'react-number-format';
export function ReactNativeNumberFormat({ value }) {
return (
<NumberFormat
value={value}
displayType={'text'}
thousandSeparator={true}
prefix={'$'}
renderText={formattedValue => <Text>{formattedValue}</Text>} // <--- Don't forget this!
/>
);
}
Это работает хорошо. Как вы можете видеть, в итоге я создал свой пользовательский компонент, который принимает value
в качестве реквизита, чтобы я мог использовать его везде, где мне это нужно. Вот так:
<View>
<ReactNativeNumberFormat value={530000} />
</View>
Надеюсь, это может быть полезно.
PS: Это моя ссылка =>https://github.com/s-yadav/react-number-format/issues/17#issuecomment-395187806.
Комментарии:
1. Не удается найти переменную React
2. @Takkie253 вам нужно добавить
import React from "react";
в верхней части вашего кода.3. Есть ли какой-либо способ разрешить включение четных букв в наш ввод при использовании формата react number
Ответ №6:
Используйте встроенную функцию React toLocaleString:
const formatNumber = (q) => {
return q.toLocaleString('en-US', {
style: 'currency',
currency: 'USD'
})
}
Комментарии:
1. не может использоваться в Android из-за Intl
Ответ №7:
Недавно я написал следующую утилиту форматирования чисел, которую можно использовать в случае OP, а также в других. Надеюсь, будет довольно просто изменить его, чтобы охватить другие случаи (я ожидаю, что большинство хотели бы изменить мои значения по умолчанию, например).
type NumberFormatProps = {
value: number;
thousandSeparator?: string;
decimalSeparator?: string;
significantDigits?: number;
showTrailingZeros?: boolean;
symbol?: '$' | 'kr.' | '%'; // Add other symbols as needed
showSymbol?: boolean;
symbolPosition?: 'before' | 'after';
showSymbolSpace?: boolean;
};
/**
* Formats a number. Supports changing symbol, thousand and decimal separators and more (see props).
* @param value The value to format
* @param thousandSeparator The separator to use between thousands
* @param decimalSeparator The separator to use before decimals
* @param significantDigits The number of significant digits to show
* @param showTrailingZeros Whether to show trailing zeros for significant digits (i.e. 1,00 if significant digits is 2)
* @param symbol The symbol to use
* @param showSymbol Whether to show the symbol
* @param symbolPosition Whether to show the symbol before or after the value
* @param showSymbolSpace Whether to show a space between the symbol and the value
* @returns
*/
export const getFormattedNumber = ({
value,
thousandSeparator = '.',
decimalSeparator = ',',
significantDigits = 0,
showTrailingZeros = false,
symbol = 'kr.',
showSymbol = true,
symbolPosition = 'after',
showSymbolSpace = true,
}: NumberFormatProps) => {
const significantDigitsExponent = 10 ** significantDigits;
const valueWithSignificantDigits = showTrailingZeros
? // If significant digits is 2 then this is e.g. 1.00, 1.10, 1.11
value.toFixed(significantDigits)
: // If significant digits is 2 then this is e.g. 1, 1.1, 1.11
`${Math.round((value Number.EPSILON) * significantDigitsExponent) / significantDigitsExponent}`;
// Split the value into the parts before and after the decimal point
const [integerPart, fractionalPart] = valueWithSignificantDigits.toString().split('.');
// Replace thousand separator in integer part
const formattedIntegerPart = `${integerPart.replace(/B(?=(d{3}) (?!d))/g, thousandSeparator)}`;
// Add decimal separator and fractional part if needed
const formattedValue = fractionalPart
? `${formattedIntegerPart}${decimalSeparator}${fractionalPart}`
: formattedIntegerPart;
// Add symbol
if (showSymbol amp;amp; Boolean(symbol)) {
const formattedValueWithSymbol =
symbolPosition === 'after' ? `${formattedValue} ${symbol}` : `${symbol} ${formattedValue}`;
return showSymbolSpace ? formattedValueWithSymbol : formattedValueWithSymbol.replace(' ', '');
}
return formattedValue;
};
В случае OP это будет называться так:
getFormattedNumber({
value: 10000,
thousandSeparator: ',',
decimalSeparator: '.',
symbol: "$",
showSymbolSpace: false,
symbolPosition: 'before',
significantDigits: 2,
showTrailingZeros: true
})
Ответ №8:
export const CurrencyFormatter = (number, options) => {
const defaultOptions = {
significantDigits: 2,
thousandsSeparator: ",",
decimalSeparator: ".",
symbol: "$",
};
const currencyFormatter = (value, options) => {
if (typeof value !== "number") value = 0.0;
options = { ...defaultOptions, ...options };
value = value.toFixed(options.significantDigits);
let valueFormatted;
if (options.significantDigits == 0) {
const [currency] = value.split(".");
valueFormatted = `${options.symbol}${currency.replace(
/B(?=(d{3}) (?!d))/g,
newOptions.thousandsSeparator
)}`;
} else {
const [currency, decimal] = value.split(".");
valueFormatted = `${options.symbol}${currency.replace(
/B(?=(d{3}) (?!d))/g,
options.thousandsSeparator
)}${options.decimalSeparator}${decimal}`;
}
return valueFormatted;
};
return currencyFormatter(number, options);
};
Ответ №9:
может быть достигнуто, как показано ниже, и вы также можете удалить конечное значение 00 в конце, если нет десятичных знаков
costing= () => {
const cost= 1478.90 940;
return parseFloat(cost).toFixed(2).replace(/(d)(?=(d{3}) (?!d))/g, '$1,');
}