@akhatmirzo/ui

Formatlash

Son, so'm, telefon, karta, sana, nisbiy vaqt, davomiylik va fayl hajmini formatlash; son va pulni so'z bilan yozish.

O'zbekistonda odatiy ko'rinishlar standart holatda: 1 250 000 so'm, +998 90 123 45 67, 21 Oktabr 2026, Chorshanba, 5 daqiqa oldin. Funksiyalar Intl va brauzer locale'iga bog'liq emas — natija serverda ham, har qanday brauzerda ham bir xil. Noto'g'ri kirishda xato otilmaydi, bo'sh satr '' qaytadi.

import {
  formatNumber,
  formatMoney,
  formatPhone,
  formatCardNumber,
  formatDate,
  parseDate,
  timeAgo,
  formatFileSize,
  numberToWords,
  moneyToWords,
  ordinal,
  ordinalWords,
  formatDateUz,
  formatDateRange,
  formatDuration,
} from '@akhatmirzo/core';

Son va pul

formatNumber(n)
1 250 000.5
formatNumber(n, { decimals: 2 })
1 250 000.50
formatMoney(n, { currency })
1 250 001 so'm

formatNumber

function formatNumber(n: number, options?: FormatNumberOptions): string;

Sonni minglik ajratuvchi bilan yozadi. Ajratuvchi — oddiy bo'sh joy (NBSP emas), shuning uchun natijani nusxalab boshqa joyga qo'yish oson. NaN va Infinity → ''.

formatNumber(1250000); // '1 250 000'
formatNumber(1250000.756); // '1 250 000.756'
formatNumber(1250000.5, { decimals: 2 }); // '1 250 000.50'
formatNumber(1234567.891, { separator: ',', decimals: 2 }); // '1,234,567.89'
formatNumber(1234567.5, { decimalMark: ',', decimals: 1 }); // '1 234 567,5'
formatNumber(-4500); // '-4 500'
formatNumber(NaN); // ''
PropTipStandartTavsif
decimalsnumber—Kasr qismidagi raqamlar (0–20). Berilmasa — son qanday bo'lsa, shunday
separatorstring' 'Minglik ajratuvchi
decimalMarkstring'.'Kasr ajratuvchisi

formatMoney

function formatMoney(n: number, options?: FormatMoneyOptions): string;

Pul summasi. Standart holatda butun songa yaxlitlanadi va so'm qo'shiladi.

formatMoney(1250000); // "1 250 000 so'm"
formatMoney(1249999.6); // "1 250 000 so'm"
formatMoney(99.5, { currency: 'UZS', decimals: 2 }); // '99.50 UZS'
formatMoney(1250000, { currency: false }); // '1 250 000'
formatMoney(-99.5, { decimals: 2 }); // "-99.50 so'm"
PropTipStandartTavsif
currency"so'm" | 'UZS' | false"so'm"Valyuta belgisi; false — belgisiz
decimalsnumber0Kasr qismidagi raqamlar
separatorstring' 'Minglik ajratuvchi
decimalMarkstring'.'Kasr ajratuvchisi

Kiritish maydoni kerakmi?

Foydalanuvchi summa yozadigan joyda MoneyInput ishlating — u yozish paytida formatlaydi va toza son qaytaradi.

formatFileSize

function formatFileSize(bytes: number, decimals?: number): string;

Fayl hajmini o'qiladigan ko'rinishga keltiradi: B, KB, MB, GB, TB (1 KB = 1024 B). Ortiqcha nollar tashlanadi. Manfiy yoki noto'g'ri qiymat → ''.

formatFileSize(512); // '512 B'
formatFileSize(1024); // '1 KB'
formatFileSize(1536); // '1.5 KB'
formatFileSize(3565158); // '3.4 MB'
formatFileSize(3565158, 0); // '3 MB'
formatFileSize(-1); // ''

decimals — kasr qismidagi raqamlar soni, standart 1.

Telefon va karta

Ikkala funksiya ham bosqichma-bosqich formatlaydi — to'liq bo'lmagan raqamni ham. Shuning uchun ularni yozish paytida, onChange ichida chaqirish mumkin:

formatPhone: +998 90 123

+998

Toza qiymat: 86001234

formatPhone

function formatPhone(input: string | number | null | undefined, style?: PhoneStyle): string;
// PhoneStyle = 'international' | 'national'

O'zbekiston raqamini formatlaydi. Bo'shliq, chiziqcha va qavslar e'tiborsiz qoldiriladi.

formatPhone('901234567'); // '+998 90 123 45 67'
formatPhone(901234567); // '+998 90 123 45 67'
formatPhone('+998 (90) 123-45-67'); // '+998 90 123 45 67'
formatPhone('+998901234567', 'national'); // '(90) 123-45-67'
formatPhone('90123', 'national'); // '(90) 123'
formatPhone(''); // ''

998 prefiksi qachon olib tashlanadi

998 faqat + bilan yoki 9 tadan ko'p raqam berilganda davlat kodi deb hisoblanadi. Aks holda u milliy raqamning boshi: formatPhone('998123456') → '+998 99 812 34 56' (operator 99).

formatCardNumber

function formatCardNumber(input: string | number | null | undefined): string;

Karta raqamini 4 tadan guruhlaydi, ko'pi bilan 19 raqam.

formatCardNumber('8600123412341234'); // '8600 1234 1234 1234'
formatCardNumber('8600-1234-12'); // '8600 1234 12'

Raqam to'g'riligini tekshirish uchun — isValidCardNumber.

Sana va vaqt

formatDate(sana, shablon) → 21 Oktabr 2026, Chorshanba

null — bunday sana yo'q

formatDate

function formatDate(date: DateInput, pattern?: string): string;
// DateInput = Date | number | string | null | undefined

Sanani shablon bo'yicha formatlaydi (mahalliy vaqtda). Oy va hafta kunlari o'zbekcha. Standart shablon — 'dd.MM.yyyy'. Noto'g'ri sana → ''.

const date = new Date(2026, 9, 21, 14, 5);

formatDate(date); // '21.10.2026'
formatDate(date, 'd MMMM yyyy, EEEE'); // '21 Oktabr 2026, Chorshanba'
formatDate(date, 'd MMM, EEE'); // '21 Okt, Ch'
formatDate(date, 'yyyy-MM-dd HH:mm'); // '2026-10-21 14:05'
formatDate(date, 'EEEE, d MMMM [soat] HH:mm'); // 'Chorshanba, 21 Oktabr soat 14:05'
formatDate('sana emas'); // ''

Jadvaldagi natijalar new Date(2026, 2, 5, 9, 5, 7) — 5-mart 2026, 09:05:07 uchun:

TokenNatijaTokenNatija
yyyy / yy2026 / 26HH / H09 / 9 (soat)
MMMMMartmm / m05 / 5 (daqiqa)
MMMMarss / s07 / 7 (soniya)
MM / M03 / 3EEEEPayshanba
dd / d05 / 5EEEPa

Kvadrat qavs ichidagi matn o'zgarmaydi: '[soat] HH:mm' → 'soat 14:05'.

parseDate

function parseDate(input: string | null | undefined, pattern?: string): Date | null;

Matnni shu shablonlar bo'yicha sanaga aylantiradi (mahalliy vaqt). Shablonga mos kelmasa yoki bunday sana mavjud bo'lmasa — null. Oy nomlari katta-kichik harfga sezgir emas, yy → 20yy, chetdagi bo'shliqlar e'tiborsiz.

parseDate('21.10.2026'); // Date: 21-oktabr 2026, 00:00
parseDate('31.02.2026'); // null — 31-fevral yo'q
parseDate('5 oktabr 2026', 'd MMMM yyyy'); // Date: 5-oktabr 2026
parseDate('2026-10-21 14:30', 'yyyy-MM-dd HH:mm'); // Date: 21-oktabr 2026, 14:30
parseDate('21.10.26', 'dd.MM.yy'); // Date: 21-oktabr 2026

timeAgo

function timeAgo(date: DateInput, now?: DateInput): string;

Nisbiy vaqt: o'tmish uchun "… oldin", kelajak uchun "…dan keyin". Bir daqiqadan kam farq — "hozirgina", bir sutkagacha — daqiqa yoki soat. Sutkadan ko'p farqda kunlar kalendar bo'yicha sanaladi: 19-oktabr 23:00 21-oktabr ertalab 08:00 dan qaraganda (33 soat) "2 kun oldin" bo'ladi. now — taqqoslash nuqtasi, standart new Date().

timeAgo → 1 soat oldin

daqiqa
  • 5 daqiqa5 daqiqa oldin
  • 180 daqiqa3 soat oldin
  • 1440 daqiqakecha
  • 4320 daqiqa3 kun oldin
  • 20160 daqiqa2 hafta oldin
  • 136800 daqiqa3 oy oldin
  • -120 daqiqa2 soatdan keyin
  • -1440 daqiqaertaga
const now = new Date(2026, 9, 21, 12, 0);
const minutes = (m: number) => new Date(now.getTime() - m * 60_000);

timeAgo(minutes(0.5), now); // 'hozirgina'
timeAgo(minutes(5), now); // '5 daqiqa oldin'
timeAgo(minutes(180), now); // '3 soat oldin'
timeAgo(minutes(1440), now); // 'kecha'
timeAgo(minutes(4320), now); // '3 kun oldin'
timeAgo(minutes(20160), now); // '2 hafta oldin'
timeAgo(minutes(-120), now); // '2 soatdan keyin'
timeAgo(minutes(-1440), now); // 'ertaga'

Birliklar: daqiqa, soat, kun, hafta, oy va yil.

Oy va hafta kunlari

const MONTHS_UZ: readonly ['Yanvar', 'Fevral', …, 'Dekabr'];
const MONTHS_UZ_SHORT: readonly ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyn', 'Iyl', …];
const WEEKDAYS_UZ: readonly ['Dushanba', 'Seshanba', …, 'Yakshanba'];
const WEEKDAYS_UZ_SHORT: readonly ['Du', 'Se', 'Ch', 'Pa', 'Ju', 'Sh', 'Ya'];
function weekdayIndex(date: Date): number; // 0 = Dushanba … 6 = Yakshanba

Hafta dushanbadan boshlanadi. JavaScript'ning getDay() esa yakshanbadan sanaydi, shuning uchun indeksni weekdayIndex bilan oling:

WEEKDAYS_UZ[weekdayIndex(new Date(2026, 9, 21))]; // 'Chorshanba'
weekdayIndex(new Date(2026, 9, 25)); // 6 — yakshanba

Qisqa oy nomlarida Iyun va Iyul Iyn / Iyl — bir-biridan farqlanishi uchun.

Son va pul so'z bilan

Hisob-faktura, shartnoma va cheklar uchun — son va summani o'zbekcha so'z bilan yozish.

numberToWords
bir million ikki yuz ellik ming
moneyToWords
Bir million ikki yuz ellik ming soʻm 50 tiyin
ordinalWords
bir million ikki yuz ellik minginchi

Alifbo va apostrof

Matn qaytaradigan barcha yangi funksiyalar script: 'latin' | 'cyrillic' opsiyasini oladi (standart 'latin', kirill — latToCyr orqali). Lotin natijada tipografik oʻ gʻ (U+02BB) ishlatiladi; apostrophe: 'ascii' bilan — oddiy '.

numberToWords

function numberToWords(n: number, options?: NumberToWordsOptions): string;

Butun son, ±999 999 999 999 999 gacha (trillion). Kasr qismi tashlanadi, manfiy son — "minus …". NaN, Infinity va chegaradan tashqari son → ''.

numberToWords(0); // 'nol'
numberToWords(21); // 'yigirma bir'
numberToWords(101); // 'yuz bir'
numberToWords(1001); // 'ming bir'
numberToWords(1_250_000); // 'bir million ikki yuz ellik ming'
numberToWords(2_300_000_000); // 'ikki milliard uch yuz million'
numberToWords(-15); // 'minus oʻn besh'
numberToWords(3.99); // 'uch'
numberToWords(1100, { formal: true }); // 'bir ming bir yuz'
numberToWords(14, { apostrophe: 'ascii' }); // "o'n to'rt"
numberToWords(1_250_000, { script: 'cyrillic' }); // 'бир миллион икки юз эллик минг'

Standart uslubda 100 — "yuz", 1000 — "ming" (faqat son ming bilan boshlanganda: 1 001 000 → "bir million bir ming"). formal: true — rasmiy hujjatlar uslubi: "bir yuz", "bir ming".

PropTipStandartTavsif
formalbooleanfalse"bir yuz", "bir ming" (rasmiy uslub)
script'latin' | 'cyrillic''latin'Alifbo
apostrophe'typographic' | 'ascii''typographic'oʻ gʻ dagi belgi: ʻ yoki '

moneyToWords

function moneyToWords(amount: number, options?: MoneyToWordsOptions): string;

Summani so'z bilan yozadi: birinchi harf katta, tiyin raqam bilan (hisob-faktura uslubi). Kasr qismi 2 raqamga yaxlitlanadi; 0 tiyin yozilmaydi. numberToWords opsiyalarini ham qabul qiladi.

moneyToWords(1_250_000.5); // 'Bir million ikki yuz ellik ming soʻm 50 tiyin'
moneyToWords(1_250_000); // 'Bir million ikki yuz ellik ming soʻm'
moneyToWords(10.25, { tiyin: 'words' }); // 'Oʻn soʻm yigirma besh tiyin'
moneyToWords(10.25, { tiyin: false }); // 'Oʻn soʻm'
moneyToWords(2500, { capitalize: false }); // 'ikki ming besh yuz soʻm'
moneyToWords(2500, { currency: 'UZS' }); // 'Ikki ming besh yuz UZS'
moneyToWords(100_000, { formal: true }); // 'Bir yuz ming soʻm'
moneyToWords(1000, { script: 'cyrillic' }); // 'Минг сўм'
PropTipStandartTavsif
currency"so'm" | 'UZS' | string"so'm""so'm" — so'z bilan (soʻm / сўм); boshqa satr o'zgarishsiz qo'shiladi
tiyin'digits' | 'words' | false'digits'"50 tiyin", "ellik tiyin" yoki yozilmaydi
capitalizebooleantrueBirinchi harf katta
formalbooleanfalse"bir yuz", "bir ming"
script'latin' | 'cyrillic''latin'Alifbo
apostrophe'typographic' | 'ascii''typographic'oʻ gʻ dagi belgi: ʻ yoki '

ordinal va ordinalWords

function ordinal(n: number): string;
function ordinalWords(n: number, options?: UzScriptOptions): string;

Tartib son. ordinal — raqam va defis (22-oktabr, 3-sinf). ordinalWords — so'z bilan: oxirgi so'z unli bilan tugasa -nchi, aks holda -inchi qo'shiladi; qo'shma sonlarda qo'shimcha oxirgi so'zga qo'shiladi. Manfiy yoki noto'g'ri son → ''.

ordinal(3); // '3-'
ordinalWords(1); // 'birinchi'
ordinalWords(2); // 'ikkinchi'
ordinalWords(4); // 'toʻrtinchi'
ordinalWords(20); // 'yigirmanchi'
ordinalWords(21); // 'yigirma birinchi'
ordinalWords(1000); // 'minginchi'
ordinalWords(2, { script: 'cyrillic' }); // 'иккинчи'

O'zbekcha sana va davomiylik

O'zbek imlosi bo'yicha: oy nomlari kichik harf bilan, kun va yil defis bilan — 22-oktabr, 2026-yil. Mavjud formatDate va MONTHS_UZ o'zgarmaydi (bosh harfli nomlar saqlanadi).

long
22-oktabr, 2026-yil
full
2026-yil 22-oktabr, payshanba
short
22-okt, 2026
dayMonth
22-oktabr
monthYear
oktabr, 2026-yil
kirill
2026-йил 22-октябрь, пайшанба
+3 kun
22–25-oktabr, 2026-yil
davomiylik
2 kun 9 soat 30 daqiqa

formatDateUz

function formatDateUz(date: DateInput, options?: FormatDateUzOptions): string;

Tayyor uslublar — shablon yozish shart emas. Noto'g'ri sana → ''.

const d = new Date(2026, 9, 22, 14, 30);

formatDateUz(d); // '22-oktabr, 2026-yil'
formatDateUz(d, { style: 'full' }); // '2026-yil 22-oktabr, payshanba'
formatDateUz(d, { style: 'short' }); // '22-okt, 2026'
formatDateUz(d, { style: 'dayMonth' }); // '22-oktabr'
formatDateUz(d, { style: 'monthYear' }); // 'oktabr, 2026-yil'
formatDateUz(d, { time: true }); // '22-oktabr, 2026-yil, 14:30'
formatDateUz(d, { script: 'cyrillic' }); // '22-октябрь, 2026-йил'

Kirill oy nomlari imlodagi shaklda: январь … июнь, июль … декабрь.

PropTipStandartTavsif
style'long' | 'full' | 'short' | 'dayMonth' | 'monthYear''long'Natija ko'rinishi
timebooleanfalseOxiriga ", HH:mm"
script'latin' | 'cyrillic''latin'Alifbo

formatDateRange

function formatDateRange(
  start: DateInput,
  end: DateInput,
  options?: FormatDateRangeOptions,
): string;

Sanalar oralig'i, takrorlarsiz. Bir kun bo'lsa — bitta sana; start > end bo'lsa o'rni almashtiriladi. Opsiyalar: style: 'long' | 'short', script.

formatDateRange(new Date(2026, 9, 20), new Date(2026, 9, 22)); // '20–22-oktabr, 2026-yil'
formatDateRange(new Date(2026, 8, 30), new Date(2026, 9, 2)); // '30-sentabr – 2-oktabr, 2026-yil'
formatDateRange(new Date(2026, 11, 30), new Date(2027, 0, 2));
// '30-dekabr, 2026-yil – 2-yanvar, 2027-yil'
formatDateRange(new Date(2026, 9, 20), new Date(2026, 9, 22), { style: 'short' });
// '20–22-okt, 2026'

formatDuration

function formatDuration(ms: number, options?: FormatDurationOptions): string;

Davomiylik (millisoniyada). Birliklar: kun, soat, daqiqa, soniya. Eng katta noldan farqli birlikdan boshlab units ta ketma-ket birlik olinadi, nol qiymatlilari tashlanadi; qoldiq kesiladi (yaxlitlanmaydi). < 1 s → '0 soniya', manfiy yoki noto'g'ri son → ''.

formatDuration(8_100_000); // '2 soat 15 daqiqa'
formatDuration(90_061_000); // '1 kun 1 soat'
formatDuration(90_061_000, { units: 3 }); // '1 kun 1 soat 1 daqiqa'
formatDuration(45_000, { style: 'short' }); // '45 s'
formatDuration(8_100_000, { style: 'short' }); // '2 soat 15 daq'
formatDuration(500); // '0 soniya'
formatDuration(8_100_000, { script: 'cyrillic' }); // '2 соат 15 дақиқа'
PropTipStandartTavsif
unitsnumber2Nechta birlik (1–4)
style'long' | 'short''long'short: kun, soat, daq, s
script'latin' | 'cyrillic''latin'Alifbo

Sahifada