Валюта (Currency)
Поле типа Валюта предназначено для хранения денежных сумм с поддержкой различных валют и автоматическим форматированием.
Основные характеристики
- Тип данных: Число с кодом валюты
- Точность: До 2 знаков после запятой (настраивается)
- Поддержка валют: Все основные мировые валюты (ISO 4217)
- Автоматическое форматирование: Символ валюты, разделители тысяч
- Конвертация: Поддержка конвертации между валютами
Настройки поля
При создании поля типа "Валюта" доступны следующие настройки:
- Название поля: Отображаемое имя поля
- Системное имя: Уникальный идентификатор для API
- Описание: Подсказка для пользователей
- Обязательное поле: Требовать заполнения
- Валюта по умолчанию: RUB, USD, EUR и т.д.
- Разрешенные валюты: Ограничение списка валют
- Точность: Количество знаков после запятой (обычно 2)
- Минимальное значение: Нижняя граница
- Максимальное значение: Верхняя граница
Примеры использования
Цена товара
{
"name": "price",
"type": "currency",
"required": true,
"defaultCurrency": "RUB",
"min": 0
}
Зарплата
{
"name": "salary",
"type": "currency",
"defaultCurrency": "USD",
"allowedCurrencies": ["USD", "EUR", "RUB"]
}
Бюджет проекта
{
"name": "budget",
"type": "currency",
"required": true,
"defaultCurrency": "EUR"
}
Работа через API
Создание записи
const record = await emd.database.collection('products').create({
name: 'Ноутбук',
price: {
amount: 89990,
currency: 'RUB'
}
});
// Или упрощенный формат (если валюта по умолчанию)
const record = await emd.database.collection('products').create({
name: 'Ноутбук',
price: 89990 // Будет использована валюта по умолчанию
});
Получение значения
const record = await emd.database.collection('products').get(recordId);
console.log(record.price);
// {
// amount: 89990,
// currency: "RUB",
// formatted: "89 990 ₽",
// symbol: "₽",
// code: "RUB"
// }
Поиск по цене
// Товары дороже 50000 рублей
const products = await emd.database.collection('products').find({
'price.amount': { $gt: 50000 },
'price.currency': 'RUB'
});
// Товары в диапазоне цен
const products = await emd.database.collection('products').find({
'price.amount': { $gte: 10000, $lte: 100000 }
});
Обновление цены
await emd.database.collection('products').update(recordId, {
price: {
amount: 99990,
currency: 'RUB'
}
});
Форматирование
Автоматическое форматирование
const record = await emd.database.collection('products').get(recordId);
// Различные форматы
console.log(record.price.formatted); // "89 990 ₽"
console.log(record.price.formattedShort); // "89,9K ₽"
console.log(record.price.formattedLong); // "89 990,00 ₽"
Форматирование для разных локалей
const price = record.price;
// Русский формат
const ruFormat = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: price.currency
}).format(price.amount);
// "89 990,00 ₽"
// Американский формат
const usFormat = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
}).format(price.amount);
// "$89,990.00"
Поддерживаемые валюты
Основные валюты
- RUB — Российский рубль (₽)
- USD — Доллар США ($)
- EUR — Евро (€)
- GBP — Фунт стерлингов (£)
- JPY — Японская иена (¥)
- CNY — Китайский юань (¥)
- CHF — Швейцарский франк (CHF)
- CAD — Канадский доллар (C$)
- AUD — Австралийский доллар (A$)
Получение списка валют
const currencies = await emd.database.getCurrencies();
console.log(currencies);
// [
// { code: 'RUB', name: 'Российский рубль', symbol: '₽' },
// { code: 'USD', name: 'Доллар США', symbol: '$' },
// ...
// ]
Конвертация валют
Получение курса валют
const rates = await emd.database.getExchangeRates('RUB');
console.log(rates);
// {
// base: 'RUB',
// rates: {
// USD: 0.011,
// EUR: 0.010,
// ...
// },
// updatedAt: '2025-11-25T10:00:00Z'
// }
Конвертация суммы
const record = await emd.database.collection('products').get(recordId);
// Конвертировать из RUB в USD
const convertedPrice = await emd.database.convertCurrency(
record.price.amount,
record.price.currency,
'USD'
);
console.log(convertedPrice);
// {
// amount: 989.89,
// currency: 'USD',
// formatted: '$989.89',
// rate: 0.011,
// originalAmount: 89990,
// originalCurrency: 'RUB'
// }
Автоматическая конвертация при получении
// Получить цену в определенной валюте
const record = await emd.database.collection('products').get(recordId, {
convertCurrency: {
price: 'USD'
}
});
console.log(record.price);
// {
// amount: 989.89,
// currency: 'USD',
// formatted: '$989.89',
// original: {
// amount: 89990,
// currency: 'RUB'
// }
// }
Математические операции
Увеличение цены
// Увеличить на 10%
const record = await emd.database.collection('products').get(recordId);
const newAmount = record.price.amount * 1.1;
await emd.database.collection('products').update(recordId, {
price: {
amount: newAmount,
currency: record.price.currency
}
});
Скидка
// Применить скидку 15%
const record = await emd.database.collection('products').get(recordId);
const discountedAmount = record.price.amount * 0.85;
await emd.database.collection('products').update(recordId, {
discounted_price: {
amount: discountedAmount,
currency: record.price.currency
}
});
Сумма
// Подсчитать общую стоимость корзины
const cartItems = await emd.database.collection('cart_items').find({
userId: currentUserId
});
const total = cartItems.reduce((sum, item) => {
return sum + (item.price.amount * item.quantity);
}, 0);
console.log({
amount: total,
currency: 'RUB',
formatted: new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
}).format(total)
});
Агрегация
Средняя цена
const avgPrice = await emd.database.collection('products').aggregate([
{
$match: { 'price.currency': 'RUB' }
},
{
$group: {
_id: null,
averagePrice: { $avg: '$price.amount' }
}
}
]);
Общая выручка
const totalRevenue = await emd.database.collection('orders').aggregate([
{
$match: {
status: 'completed',
'total.currency': 'RUB'
}
},
{
$group: {
_id: null,
total: { $sum: '$total.amount' }
}
}
]);
Валидация
Проверка минимальной суммы
{
"name": "price",
"type": "currency",
"min": 100,
"currency": "RUB"
}
try {
await emd.database.collection('products').create({
name: 'Товар',
price: {
amount: 50,
currency: 'RUB'
}
});
} catch (error) {
console.error(error.message); // "Price must be at least 100 RUB"
}
Отображение в интерфейсе
Цветовое кодирование
function getPriceColor(amount) {
if (amount < 1000) return 'green';
if (amount < 10000) return 'blue';
return 'red';
}
Сравнение цен
const product = await emd.database.collection('products').get(recordId);
if (product.discounted_price) {
return `
<span class="original-price">${product.price.formatted}</span>
<span class="discounted-price">${product.discounted_price.formatted}</span>
<span class="discount">-${Math.round((1 - product.discounted_price.amount / product.price.amount) * 100)}%</span>
`;
}
Рекомендации
- Используйте тип Currency для всех денежных значений
- Храните цены в минимальных единицах (копейки, центы) для точности
- Всегда указывайте валюту явно
- Используйте конвертацию для международных приложений
- Обновляйте курсы валют регулярно
- Учитывайте комиссии при конвертации
- Используйте правильное форматирование для локали пользователя
- Для криптовалют используйте большую точность (8 знаков)
Отличие от других типов
- Currency vs Number: Currency включает валюту и форматирование
- Currency vs String: Currency обеспечивает валидацию и математические операции
- Currency vs Percent: Currency для денег, Percent для процентов