Mundarija (39)
- Bu darsda
- 1. Nega bu kerak?
- 2. Number() qaysi satrni qabul qiladi?
- 2.1 Number son deb biladigan satrlar
- 2.2 Number rad etadigan satrlar
- 2.3 Unar + — xuddi Number
- 3. parseInt va parseFloat chuqurroq
- 3.1 Boshidan o'qib, to'xtaydi
- 3.2 1e3 bilan qiziq farq
- 3.3 Radix — sanoq tizimi
- 3.4 parseFloat da radix yo'q
- 3.5 parseInt ga son bermang
- 4. Sonni tekshirish
- 4.1 Number.isNaN va global isNaN
- 4.2 Number.isFinite — eng foydali tekshiruv
- 4.3 Number.isInteger — butunmi?
- 4.4 Number.isSafeInteger va "son bo'lmagan raqamlar"
- 5. Sonni matnga: toFixed va toPrecision
- 5.1 toFixed — kasr xonalari soni
- 5.2 Tuzoq: toFixed satr qaytaradi
- 5.3 toFixed ham adashadi
- 5.4 toPrecision — qiymatli raqamlar soni
- 6. Amaliyot: "12 000 so'm" ni tekshirish
- 6.1 To'liq yechilgan misol
- 6.2 Vergulli kasr: bo'sh joyni to'ldiring
- 6.3 Nusxalangan matndagi ko'rinmas bo'sh joy
- 7. Hujumchi nigohi
- 8. Ko'p uchraydigan xatolar
- 8.1 Global isNaN bilan tekshirish
- 8.2 NaN ni === bilan tekshirish
- 8.3 Radix'siz parseInt
- 8.4 toFixed natijasi bilan hisoblash
- 8.5 Telefon yoki karta raqamini son qilish
- 9. Mashqlar
- 1-mashq (oson): Natijani oldindan ayting
- 2-mashq (o'rta): Mahsulot soni
- 3-mashq (qiyin): Qat'iy summa tekshiruvi
- 10. Real ishda
- Xulosa
JavaScript'da matnni songa aylantirish: Number, parseInt va sonni tekshirish
Qisqacha: Satrni songa aylantirishning uch yo'li bor: qat'iy
Number("12"), kechirimliparseInt("12px", 10)vaparseFloat("1.5kg"). Aylantirgandan keyin natijani albatta tekshiring:Number.isFinite(x)— to'g'ri sonmi,Number.isInteger(x)— butunmi. Teskari yo'nalishdagitoFixed(2)esa son emas, satr qaytaradi.
Bu darsda
Number, unar+,parseIntvaparseFloatqaysi satrni qanday o'qishini aniq bilasiz.parseIntga nega doim ikkinchi qiymat —10— yozilishini tushuntira olasiz.Number.isNaN,Number.isFinite,Number.isInteger,Number.isSafeIntegerbilan sonni tekshira olasiz.toFixedvatoPrecisionsatr qaytarishini va undagi tuzoqlarni bilasiz.- Formadan kelgan
"12 000 so'm"kabi matnni tozalab, songa aylantirib, tekshira olasiz.
Oldin bilishingiz kerak: Turlarni aniq o'zgartirish, Number turi JS'da, Son yozish shakllari va sanoq tizimlari, Matnni o'zgartirish va tozalash.
1. Nega bu kerak?
Oldingi darsda sonni turli shakllarda yozishni ko'rdik: 0xff, 1e6, 1_000_000. Endi teskari savol: son matn bo'lib kelsa-chi?
Tasavvur qiling: siz Payme'ga o'xshash ilovada "O'tkazma summasi" maydonini yozyapsiz. Foydalanuvchilar summani har xil yozadi:
console.log(Number("12000")); // 12000
console.log(Number("12 000 so'm")); // NaN
console.log(Number("1e9")); // 1000000000
console.log(Number("-5000")); // -5000Birinchisi to'g'ri. Ikkinchisi — oddiy odam yozgan eng tabiiy summa, lekin NaN. Uchinchisini kimdir ataylab yozgan: 1e9 — bu bir milliard! To'rtinchisi — manfiy o'tkazma, ya'ni boshqaning hisobidan pul olishga urinish.
Demak, ish ikki qadamdan iborat:
- Aylantirish — satrdan son olish.
- Tekshirish — olingan son haqiqatan biz kutgan sonmi.
Turlarni aniq o'zgartirish darsida birinchi qadam bilan tanishgandik. Bu darsda ikkalasini ham oxirigacha o'rganamiz.
Hayotdan o'xshatish: bankka pul topshirasiz. Kassir avval pulni sanaydi (aylantirish), keyin har bir kupyurani chiroqqa tutib qalbaki emasligini tekshiradi (tekshirish). Faqat sanash yetarli emas.
2. Number() qaysi satrni qabul qiladi?
2.1 Number son deb biladigan satrlar
Turlarni aniq o'zgartirish darsidan eslaysiz: Number() qat'iy. Satr to'liq son bo'lsa qabul qiladi, bitta begona belgi bo'lsa — NaN. Lekin "to'liq son" deganda JavaScript siz kutgandan ko'proq narsani tushunadi:
console.log(Number("1e3")); // 1000
console.log(Number("0x10")); // 16
console.log(Number("0b101")); // 5
console.log(Number("Infinity")); // Infinity
console.log(Number(".5")); // 0.5
console.log(Number("5.")); // 5
console.log(Number("+7")); // 7Bular — oldingi darsdagi son yozish shakllari. JavaScript kodda 1e3 ni son deb tushunsa, satr ichida ham tushunadi. Formada esa bu kutilmagan "eshik" bo'lishi mumkin — buni 6-bo'limda ko'ramiz.
2.2 Number rad etadigan satrlar
console.log(Number("12_000")); // NaN
console.log(Number("12,5")); // NaN
console.log(Number("12 000")); // NaN
console.log(Number("12px")); // NaNBirinchi qatorga e'tibor bering. Kodda 12_000 yozsangiz — bu son, 12000. Lekin satr ichidagi "12_000" — NaN. Pastki chiziq faqat dasturchi kodni o'qishi uchun, u satrdan son o'qishda ishlamaydi.
| Satr | Number(...) |
Nega |
|---|---|---|
"1e3", "0x10" |
1000, 16 |
JS son yozish shakllari |
" 42 " |
42 |
Chetdagi bo'sh joy tashlanadi |
"" |
0 |
Tuzoq — J-18 darsida ko'rdik |
"12_000", "12,5" |
NaN |
_ va vergul — begona belgi |
"12 000" |
NaN |
O'rtadagi bo'sh joy — begona belgi |
2.3 Unar + — xuddi Number
Unar + aynan Number() qoidalari bilan ishlaydi. Farqi faqat yozilishida:
console.log(+"1e3"); // 1000
console.log(+"12px"); // NaN
console.log(+" 8 "); // 8Shuning uchun bu darsda Number() haqida aytilgan hamma gap unar + ga ham tegishli.
Tekshirib ko'ring:
Number("0x1A")vaNumber("1_5")nima qaytaradi?
Javob
26 va NaN. 0x1A — o'n oltilik son (1 × 16 + 10 = 26), Number uni satrda ham taniydi. 1_5 esa satr ichida son emas: pastki chiziq faqat kodda ishlaydi.
3. parseInt va parseFloat chuqurroq
3.1 Boshidan o'qib, to'xtaydi
parseInt va parseFloat boshqacha ishlaydi. Ular satrni chapdan o'ngga o'qiydi va son bo'lmagan birinchi belgida to'xtaydi. Boshidagi bo'sh joylar va ishora (-, +) hisobga olinadi:
console.log(parseInt(" 42abc", 10)); // 42
console.log(parseInt("-12.9", 10)); // -12
console.log(parseFloat("3.14.15")); // 3.14
console.log(parseFloat(".5")); // 0.5
console.log(parseInt("so'm 500", 10)); // NaNOxirgi qatorda satr harf bilan boshlangan. Boshida bitta ham raqam yo'q — natija NaN.
Hayotdan o'xshatish: kassir chekni chapdan o'qiydi va birinchi tushunarsiz belgida to'xtaydi. Number esa qat'iy nazoratchi: chekda bitta ortiqcha belgi bo'lsa, butun chekni qaytaradi.
3.2 1e3 bilan qiziq farq
console.log(Number("1e3")); // 1000
console.log(parseFloat("1e3")); // 1000
console.log(parseInt("1e3", 10)); // 1parseFloat ilmiy yozuvni (e) taniydi. parseInt esa faqat butun son raqamlarini o'qiydi: 1 ni oladi, e da to'xtaydi.
3.3 Radix — sanoq tizimi
parseInt dagi ikkinchi qiymat radix (sanoq tizimi asosi) deyiladi. U 2 dan 36 gacha bo'ladi va "satrni qaysi sanoq tizimida o'qiyman" degan savolga javob beradi. Son yozish shakllari darsida parseInt("ff", 16) ni ko'rgandik:
console.log(parseInt("ff", 16)); // 255
console.log(parseInt("101", 2)); // 5
console.log(parseInt("12", 2)); // 1
console.log(parseInt("2", 2)); // NaNUchinchi qatorga qarang. Ikkilik tizimda faqat 0 va 1 bor. parseInt 1 ni o'qidi, 2 ni "begona belgi" deb to'xtadi. To'rtinchi qatorda esa birinchi belgining o'zi begona.
Endi eng muhim savol: radix yozilmasa nima bo'ladi?
console.log(parseInt("0x1f")); // 31
console.log(parseInt("0x1f", 10)); // 0
console.log(parseInt("08")); // 8Radix yozilmasa, parseInt satr boshiga qaraydi. 0x bilan boshlansa — o'n oltilik deb o'qiydi. Tasavvur qiling: mahsulot kodi "0x1f" bo'lib qolgan, siz esa o'nlik son kutyapsiz. Natija jimgina 31 bo'ladi — xato xabarisiz.
Maslahat: Eski brauzerlarda
parseInt("08")sakkizlik tizimda o'qilib,0qaytarardi. Hozir bu tuzatilgan, lekin0xtuzog'i qolgan. Qoida oddiy: radix'ni har doim yozing —parseInt(s, 10). ESLint (kodni avtomatik tekshiradigan vosita, keyinroq o'rganamiz) buniradixqoidasi bilan eslatib turadi.
3.4 parseFloat da radix yo'q
parseFloat faqat o'nlik tizimda ishlaydi, ikkinchi qiymat qabul qilmaydi. 0x ni ham tanimaydi:
console.log(parseFloat("0x10")); // 0
console.log(parseFloat("12,5")); // 12Ikkinchi qator — O'zbekistonda ko'p uchraydigan tuzoq. Vergulli kasr 12,5 jimgina 12 ga aylandi. Yarim kilogramm yo'qoldi, xato esa chiqmadi.
3.5 parseInt ga son bermang
parseInt satr uchun yaratilgan. Unga son bersangiz, avval sonni satrga aylantiradi. Bu kutilmagan natija beradi:
console.log(parseInt(0.0000005)); // 5
console.log(String(0.0000005)); // 5e-7Juda kichik son satrga "5e-7" bo'lib aylanadi. parseInt undan 5 ni o'qiydi va e da to'xtaydi. Natija — nol o'rniga besh!
Sonning kasr qismini tashlash kerak bo'lsa, parseInt emas, Math.trunc yoki Math.floor ishlating. Ularni keyingi darsda o'rganamiz.
Maslahat:
Number.parseIntvaNumber.parseFloatham bor. Ular globalparseIntvaparseFloatning aynan o'zi:Number.parseInt === parseInt—true. Zamonaviy kodda ikkalasini ham uchratasiz.
Tekshirib ko'ring:
parseInt("15px", 10) + parseInt("5px", 10)vaparseInt("0x1f", 16)nima beradi?
Javob
20 va 31. Birinchisida har bir satrdan boshidagi son olinadi: 15 + 5. Ikkinchisida radix 16. Shu holda parseInt boshidagi 0x ni o'n oltilik belgisi sifatida o'tkazib yuboradi va 1f ni o'qiydi: 1 × 16 + 15 = 31.
4. Sonni tekshirish
Satrni aylantirdik. Endi natijani tekshirish kerak. Number obyektida buning uchun to'rtta tayyor tekshiruv bor.
4.1 Number.isNaN va global isNaN
Tenglik darsidan bilasiz: NaN === NaN — false. Shuning uchun NaN ni maxsus tekshiruv bilan aniqlaymiz. Number turi darsida Number.isNaN bilan tanishdik va eski global isNaN ham borligini aytdik. Endi ularning farqini aniq ko'ramiz — bu ikki tekshiruv har xil ishlaydi:
console.log(isNaN("salom")); // true
console.log(Number.isNaN("salom")); // false
console.log(isNaN("")); // false
console.log(isNaN(undefined)); // trueGlobal isNaN (oldida Number. yo'q) avval qiymatni songa aylantiradi, keyin tekshiradi. "salom" → NaN → true. "" → 0 → false.
Number.isNaN esa hech narsani aylantirmaydi. U bitta savolga javob beradi: "bu qiymatning o'zi NaN mi?" "salom" — satr, NaN emas. Shuning uchun false.
| Qiymat | isNaN(x) |
Number.isNaN(x) |
|---|---|---|
NaN |
true |
true |
"salom" |
true |
false |
"" |
false |
false |
undefined |
true |
false |
Qoida: Number.isNaN ishlating va uni aylantirishdan keyin qo'llang:
const kiritilgan = "salom";
const son = Number(kiritilgan);
console.log(Number.isNaN(son)); // true4.2 Number.isFinite — eng foydali tekshiruv
NaN dan tashqari yana bir "yolg'on son" bor — Infinity. U ham number turida, lekin summa sifatida ma'nosiz. Number turi darsida ko'rgandik:
const son = Number("1e999");
console.log(son); // Infinity
console.log(Number.isNaN(son)); // false
console.log(Number.isFinite(son)); // false1e999 — juda katta son, u Infinity ga aylandi. Number.isNaN uni o'tkazib yubordi: Infinity — NaN emas. Number.isFinite esa ushladi.
Number.isFinite(x) faqat bitta holatda true beradi: x — oddiy, chekli son bo'lsa. NaN, Infinity, -Infinity va son bo'lmagan har qanday qiymat — false. Ya'ni bitta tekshiruv ikkita muammoni ushlaydi.
Bu yerda ham global "egizak" bor — isFinite. U ham avval aylantiradi:
console.log(isFinite("12")); // true
console.log(Number.isFinite("12")); // false
console.log(isFinite(null)); // trueQoida xuddi o'sha: Number. bilan boshlanadiganini ishlating. Global isNaN va isFinite — JavaScript'ning eski, 1990-yillardan qolgan versiyalari.
4.3 Number.isInteger — butunmi?
Ba'zi qiymatlar faqat butun bo'lishi kerak: mahsulot soni, yosh, xonadon raqami. 2,5 ta non sotib bo'lmaydi.
console.log(Number.isInteger(5)); // true
console.log(Number.isInteger(5.0)); // true
console.log(Number.isInteger(5.5)); // false
console.log(Number.isInteger("5")); // false
console.log(Number.isInteger(Infinity)); // falseIkkinchi qator g'alati tuyulishi mumkin. Lekin JavaScript uchun 5.0 va 5 — bir xil son, ular farqlanmaydi. Number.isInteger ham aylantirmaydi: "5" satri — false. NaN va Infinity ham false. Demak Number.isInteger o'z ichida Number.isFinite tekshiruvini ham bajaradi.
4.4 Number.isSafeInteger va "son bo'lmagan raqamlar"
Number turi darsida Humo karta raqami songa aylanganda oxirgi raqami jimgina o'zgarib qolganini va Number.isSafeInteger buni aniqlashini ko'rdik. Satrdan aylantirganda ham xuddi shunday:
const karta = Number("9860123456789013");
console.log(karta); // 9860123456789012
console.log(Number.isSafeInteger(karta)); // false...013 — ...012 bo'lib qoldi. Eslatma: Number.isSafeInteger son butun va xavfsiz chegarada bo'lsagina true beradi.
Bundan muhim xulosa kelib chiqadi. Karta raqami, telefon raqami, pasport seriyasi, buyurtma ID si — bular "son" emas, raqamlardan iborat matn. Ular bilan hech kim qo'shish yoki ko'paytirish qilmaydi. Ularni songa aylantirsangiz, boshqa narsalar ham yo'qoladi:
console.log(Number("+998901234567")); // 998901234567
console.log(Number("007")); // 7+ belgisi va boshidagi nollar yo'qoldi. Qoida: hisoblamaydigan raqamlarni satr holida saqlang. Juda katta sonlar bilan aniq hisoblash kerak bo'lsa — BigInt bor, uni 3 darsdan keyin o'rganamiz.
| Tekshiruv | true bo'ladi, agar... |
Qayerda |
|---|---|---|
Number.isNaN(x) |
x — aynan NaN |
Aylantirish muvaffaqiyatsizmi? |
Number.isFinite(x) |
x — oddiy chekli son |
Umumiy "to'g'ri sonmi?" |
Number.isInteger(x) |
x — butun son |
Soni, yosh, dona |
Number.isSafeInteger(x) |
butun va aniq saqlangan | Katta ID va hisoblagichlar |
Tekshirib ko'ring:
Number.isFinite(Number(""))nima qaytaradi? Bu forma tekshiruvi uchun qanday xavf?
Javob
true. Number("") — 0, nol esa oddiy chekli son. Demak faqat Number.isFinite bilan tekshirsangiz, bo'sh maydon "0 so'm" bo'lib o'tib ketadi. Shuning uchun summa uchun qo'shimcha shart kerak: son > 0.
5. Sonni matnga: toFixed va toPrecision
5.1 toFixed — kasr xonalari soni
Narxni ekranda chiroyli ko'rsatish uchun ko'pincha aniq ikki xona kerak: 5.00, 12.50. Buni toFixed(n) metodi qiladi — n ta kasr xonasigacha yaxlitlaydi:
const narx = 5;
const kurs = 12650.3456;
const reyting = 4.75;
console.log(narx.toFixed(2)); // 5.00
console.log(kurs.toFixed(2)); // 12650.35
console.log(reyting.toFixed(1)); // 4.8
console.log((0.1 + 0.2).toFixed(2)); // 0.30Son o'zgaruvchida bo'lsa, metod nuqta bilan chaqiriladi: narx.toFixed(2). Sonning o'ziga yozsangiz, qavsga oling: (5).toFixed(2). Sababi J-18 darsida: 5.toFixed da JavaScript nuqtani kasr belgisi deb o'ylaydi.
5.2 Tuzoq: toFixed satr qaytaradi
Bu darsning eng muhim ogohlantirishi:
const narx = (0.1 + 0.2).toFixed(2);
console.log(typeof narx); // string
console.log(narx + 1); // 0.3010.30 + 1 = 1.3 kutgandik. Lekin toFixed satr qaytaradi — "0.30". Satrga + 1 esa yopishtirish bo'ladi: "0.301".
Nega satr? Chunki 5.00 dagi nollar faqat matnda mavjud. Son sifatida 5.00 va 5 — bir xil, sonda "ikki xona" degan tushuncha yo'q. toFixed ning vazifasi — ko'rsatish uchun matn tayyorlash.
Qoida: toFixed ni hisob-kitobning eng oxirida, ekranga chiqarishdan oldin ishlating. Oraliq natijani toFixed bilan "yaxlitlab", keyin hisoblashni davom ettirmang.
5.3 toFixed ham adashadi
const a = 1.005;
const b = 2.345;
console.log(a.toFixed(2)); // 1.00
console.log(b.toFixed(2)); // 2.351.005 ni ikki xonaga yaxlitlasak, 1.01 kutamiz. Natija esa 1.00. Sababi Number turi darsida: 1.005 xotirada aslida 1.00499999... bo'lib saqlanadi. 2.345 esa tasodifan biroz kattaroq saqlanadi va "to'g'ri" yaxlitlanadi.
Ya'ni toFixed pul hisobi uchun ishonchli emas. Pulni qanday aniq hisoblashni Pul va aniq hisob-kitob darsida ko'ramiz.
5.4 toPrecision — qiymatli raqamlar soni
toPrecision(n) kasr xonalarini emas, jami qiymatli raqamlar sonini belgilaydi. U ham satr qaytaradi:
const son = 1234.5678;
const kichik = 0.000123;
console.log(son.toPrecision(6)); // 1234.57
console.log(kichik.toPrecision(2)); // 0.00012
console.log(son.toPrecision(2)); // 1.2e+3Uchinchi qatorda son ilmiy yozuvga o'tdi: 2 ta raqam bilan 1234 ni boshqacha yozib bo'lmaydi. toPrecision o'lchov va ilmiy hisoblarda ishlatiladi. Kundalik ishda toFixed ancha ko'p uchraydi.
Tekshirib ko'ring:
(7).toFixed(1) + (3).toFixed(1)nima beradi?
Javob
"7.03.0" satri. Ikkala toFixed ham satr qaytaradi: "7.0" va "3.0". Ikki satrga + — yopishtirish. 10 kerak bo'lsa, avval sonlarni qo'shing, keyin natijaga bir marta toFixed qo'llang: (7 + 3).toFixed(1) — "10.0".
6. Amaliyot: "12 000 so'm" ni tekshirish
Endi hammasini birlashtiramiz. Vazifa: foydalanuvchi o'tkazma summasini yozdi. Uni songa aylantirib, to'g'riligini tekshirish kerak.
6.1 To'liq yechilgan misol
const kiritilgan = " 12 000 so'm ";
const tozalangan = kiritilgan
.replace("so'm", "")
.replaceAll(" ", "");
const summa = Number(tozalangan);
const togri = Number.isInteger(summa) && summa > 0;
console.log(tozalangan); // 12000
console.log(summa); // 12000
console.log(togri); // trueQatorma-qator:
replace("so'm", "")— "so'm" so'zini olib tashlaymiz. Matnni o'zgartirish darsidan.replaceAll(" ", "")— hamma bo'sh joylarni olib tashlaymiz: chetdagilarni ham,12 000o'rtasidagini ham.Number(tozalangan)— qat'iy aylantirish. Tozalanmagan har qanday begona belgiNaNberadi.Number.isInteger(summa)— summa butun son. BuNaNvaInfinityni ham rad etadi.summa > 0— manfiy summa va nol rad etiladi. Bo'sh satr0ga aylanishini eslaysizmi? U ham shu yerda ushlanadi.
&& — mantiqiy operatorlar darsidagi "va": ikkala shart ham true bo'lsagina togri — true.
Endi natijani foydalanuvchiga ko'rsatamiz. Ternary yordam beradi:
const kiritilgan = "12 000 so'm";
const summa = Number(
kiritilgan.replace("so'm", "").replaceAll(" ", ""),
);
const togri = Number.isInteger(summa) && summa > 0;
console.log(togri ? `O'tkazma: ${summa} so'm` : "Noto'g'ri summa");
// O'tkazma: 12000 so'mkiritilgan ni "abc", "-500" yoki "" ga o'zgartirib ko'ring — har safar Noto'g'ri summa chiqadi.
6.2 Vergulli kasr: bo'sh joyni to'ldiring
Endi vazn maydoni: foydalanuvchi "2,5 kg" yozdi. Vergulni nuqtaga almashtirish va "kg" ni olib tashlash kerak. Tekshiruv — Number.isFinite, chunki vazn kasr bo'lishi mumkin.
const kiritilgan = "2,5 kg";
const vazn = Number(
kiritilgan.replace("kg", "").replace(",", ".").trim(),
);
const togri = Number.isFinite(vazn) && vazn > 0;
console.log(vazn); // 2.5
console.log(togri); // trueSavol: bu yerda nega Number.isInteger emas, Number.isFinite ishlatildi? Chunki vazn bo'lishi mumkin, Number.isInteger(2.5) esa false qaytaradi.
6.3 Nusxalangan matndagi ko'rinmas bo'sh joy
Real hayotdagi tuzoq. Foydalanuvchi summani boshqa saytdan nusxalab qo'ydi. Ekranda 12 000 ko'rinadi, lekin kod ishlamaydi:
const kiritilgan = "12\u00a0000";
const summa = Number(kiritilgan.replaceAll(" ", ""));
console.log(summa); // NaN\u00a0 — String asoslari darsidagi Unicode escape. Bu uzilmas bo'sh joy (non-breaking space). U oddiy bo'sh joyga o'xshaydi, lekin boshqa belgi. Saytlar undan son ichida foydalanadi: 12 va 000 ikki qatorga bo'linib ketmasin deb. Keyingi darslarda ko'rasiz: JavaScript'ning o'zi ham sonni formatlaganda aynan shu belgini qo'yadi.
replaceAll(" ", "") faqat oddiy bo'sh joyni olib tashlaydi. Yechim — uzilmas bo'sh joyni ham alohida olib tashlash:
const kiritilgan = "12\u00a0000";
const summa = Number(
kiritilgan.replaceAll(" ", "").replaceAll("\u00a0", ""),
);
console.log(summa); // 12000Istalgan bo'sh joy turini bittada olib tashlash uchun muntazam ifodalar (regex) ishlatiladi. Ularni RegExp asoslari darsida o'rganamiz.
7. Hujumchi nigohi
Formadagi summa — pul bilan bog'liq joy. Hujumchi uni qanday buzishga urinadi?
| U yozadi | Number(...) |
Xavf |
|---|---|---|
-50000 |
-50000 |
Teskari o'tkazma |
1e9 |
1000000000 |
Qisqa yozuvdagi ulkan summa |
0x10 |
16 |
Ko'rinishi boshqa, qiymati boshqa |
Infinity |
Infinity |
Hisob-kitobni buzish |
0.0001 |
0.0001 |
Yaxlitlashdan foyda olish |
6.1 dagi tekshiruvimiz (Number.isInteger va > 0) manfiy, Infinity va kasr summalarni to'xtatadi. Lekin 1e9 va 0x10 o'tib ketadi — ikkalasi ham musbat butun son. Bundan himoyalanishning ikki qo'shimcha qadami bor.
Birinchisi — yuqori chegara. Ilova bir o'tkazmada qancha ruxsat beradi? Masalan 100 million so'm:
const summa = Number("1e9");
const togri =
Number.isInteger(summa) && summa > 0 && summa <= 100_000_000;
console.log(togri); // falseIkkinchisi — qayta yozib solishtirish. Sonni yana satrga aylantiramiz. Natija tozalangan matn bilan aynan bir xil bo'lishi kerak:
const tozalangan = "0x10";
const summa = Number(tozalangan);
console.log(String(summa)); // 16
console.log(String(summa) === tozalangan); // false"0x10" → 16 → "16". Bu "0x10" ga teng emas — demak foydalanuvchi oddiy son yozmagan. Bu usul "1e3", "+5" va "007" ni ham rad etadi. Oddiy "12000" esa "12000" bo'lib qaytadi va o'tadi.
Diqqat: Brauzerdagi har qanday tekshiruvni chetlab o'tish mumkin. Hujumchi sahifani emas, to'g'ridan-to'g'ri serverga so'rov yuboradi. Shuning uchun summa serverda qayta tekshiriladi. Buni Validatsiya darsida to'liq ko'ramiz. Brauzerdagi tekshiruv — foydalanuvchiga qulaylik, himoya esa serverda.
8. Ko'p uchraydigan xatolar
8.1 Global isNaN bilan tekshirish
isNaN("") — false, ya'ni "bo'sh satr son". Global versiya avval aylantiradi va sizni aldaydi. Doim Number.isNaN yoki, yaxshisi, Number.isFinite ishlating.
8.2 NaN ni === bilan tekshirish
const son = Number("abc");
console.log(son === NaN); // false
console.log(Number.isNaN(son)); // trueNaN hech narsaga, hatto o'ziga ham teng emas. son === NaN har doim false — bu shart hech qachon ishlamaydi. Xato xabari ham chiqmaydi, shuning uchun sezish qiyin.
8.3 Radix'siz parseInt
parseInt("0x1f") — 31. Satr qayerdan kelishini bilmasangiz, natijani ham bilmaysiz. Har doim parseInt(s, 10).
8.4 toFixed natijasi bilan hisoblash
2.5-bob.toFixed(1) + 1 — "2.51". toFixed faqat ekranga chiqarish uchun. Hisob-kitob sonlar bilan, formatlash eng oxirida.
8.5 Telefon yoki karta raqamini son qilish
Number("+998901234567") — + yo'qoladi. Number("9860123456789013") — oxirgi raqam o'zgaradi. Hisoblamaydigan raqamlar — satr.
9. Mashqlar
1-mashq (oson): Natijani oldindan ayting
Har bir qator nima chiqarishini daftarga yozing, keyin ishga tushirib tekshiring.
const reyting = 9.5;
console.log(Number("2e2"));
console.log(parseInt("2e2", 10));
console.log(parseFloat("2e2"));
console.log(parseInt("101", 2));
console.log(Number.isNaN("abc"));
console.log(Number.isInteger(7.0));
console.log(reyting.toFixed(0) + 1);Yechim
const reyting = 9.5;
console.log(Number("2e2")); // 200
console.log(parseInt("2e2", 10)); // 2
console.log(parseFloat("2e2")); // 200
console.log(parseInt("101", 2)); // 5
console.log(Number.isNaN("abc")); // false
console.log(Number.isInteger(7.0)); // true
console.log(reyting.toFixed(0) + 1); // 1012e2—2 × 100.NumbervaparseFloatilmiy yozuvni taniydi,parseIntesaeda to'xtaydi."101"ikkilik tizimda —5.Number.isNaN("abc")—false, chunki"abc"satr,NaNemas.7.0va7— bir xil son.reyting.toFixed(0)—"10"satri, unga1yopishadi:"101".
2-mashq (o'rta): Mahsulot soni
Onlayn do'konda "Soni" maydoni bor. kiritilgan o'zgaruvchisida foydalanuvchi yozgan satr. togri o'zgaruvchisi faqat quyidagi holda true bo'lsin: son butun, 1 dan kichik emas va 99 dan katta emas. Ekranga ternary bilan Savatga qo'shildi: 3 ta yoki Soni 1 dan 99 gacha bo'lishi kerak chiqaring.
kiritilgan ga "3", " 3 ", "2.5", "0", "150" va "" berib sinab ko'ring.
Ishora: Number(), Number.isInteger, >=, <= va && yetarli. Taqqoslash operatorlari — taqqoslash darsidan.
Yechim
const kiritilgan = " 3 ";
const soni = Number(kiritilgan);
const togri = Number.isInteger(soni) && soni >= 1 && soni <= 99;
console.log(
togri
? `Savatga qo'shildi: ${soni} ta`
: "Soni 1 dan 99 gacha bo'lishi kerak",
);
// Savatga qo'shildi: 3 ta" 3 "— chetdagi bo'sh joylarniNumbero'zi tashlaydi."2.5"—isIntegerrad etadi."0"va""— ikkalasi0,soni >= 1rad etadi."150"—soni <= 99rad etadi.
3-mashq (qiyin): Qat'iy summa tekshiruvi
Click'ga o'xshash ilova uchun summa tekshiruvini yozing. kiritilgan satri quyidagicha qayta ishlansin:
"so'm"so'zi, oddiy bo'sh joylar va uzilmas bo'sh joylar ("\u00a0") olib tashlanadi.- Natija
Number()bilan songa aylanadi. togrifaqat shundatrue: summa butun, 1 000 dan kam emas, 50 000 000 dan ko'p emas vaString(summa)tozalangan matnga aynan teng.
"12 000 so'm", "1e4", "500", "12\u00a0000" va "0012000" bilan sinab ko'ring. Qaysilari o'tishi kerak?
Ishora: replace va replaceAll ni ketma-ket yozing — Matnni o'zgartirish. Katta sonlarni 1_000 kabi yozish mumkin — Son yozish shakllari.
Yechim
const kiritilgan = "12\u00a0000 so'm";
const tozalangan = kiritilgan
.replace("so'm", "")
.replaceAll(" ", "")
.replaceAll("\u00a0", "");
const summa = Number(tozalangan);
const togri =
Number.isInteger(summa) &&
summa >= 1_000 &&
summa <= 50_000_000 &&
String(summa) === tozalangan;
console.log(tozalangan); // 12000
console.log(togri); // true| Kiritilgan | Natija | Sabab |
|---|---|---|
"12 000 so'm" |
o'tadi | Tozalangandan keyin "12000" |
"12\u00a0000" |
o'tadi | Uzilmas bo'sh joy ham olindi |
"1e4" |
rad | String(10000) — "10000", "1e4" emas |
"500" |
rad | 1 000 dan kam |
"0012000" |
rad | "12000" ≠ "0012000" |
Oxirgisi bahsli: 0012000 — aslida to'g'ri summa. Qat'iy tekshiruv uni ham rad etdi. Real loyihada qaysi biri muhimroq — qat'iylikmi yoki qulaylikmi — jamoa bilan kelishiladi.
10. Real ishda
- Formalar: har bir sonli maydon — aylantirish va tekshirish. Forma qiymatlarini o'qish darsida buni brauzerda qilasiz.
- Server: so'rov bilan kelgan
?page=2yokiamount— satr. Backend'da ham xuddi shuNumber+Number.isIntegerjuftligi ishlatiladi. - Validatsiya kutubxonalari: Zod (ma'lumot tekshirish kutubxonasi, kursda alohida dars bor) ichida xuddi shu tekshiruvlar yotadi:
z.number().int().positive(). Kutubxonani tushunish uchun bu darsdagi asos kerak. - Intervyu: "
isNaNvaNumber.isNaNfarqi?", "parseIntga nega radix beriladi?", "parseInt(0.0000005)nega5?" — tez-tez beriladigan savollar.
Xulosa
Number()va unar+— qat'iy: satr to'liq son bo'lishi kerak. Lekin"1e3","0x10","Infinity"ni ham son deb qabul qiladi.parseInt(s, 10)vaparseFloat(s)— satr boshidagi sonni oladi.parseIntga radix'ni doim yozing va unga son bermang.- Global
isNaN/isFiniteo'rnigaNumber.isNaN,Number.isFinite,Number.isIntegerishlating — ular aylantirmaydi. - Karta, telefon, ID — satr bo'lib qoladi: son bo'lsa,
+, nollar va raqamlar yo'qolishi mumkin. toFixedvatoPrecisionsatr qaytaradi va faqat ko'rsatish uchun.- Forma kiritishi: tozalash →
Number→ tekshirish (butunmi, chegaradami) → serverda yana tekshirish.
Keyingi dars: Math obyekti — sonlarni yaxlitlash, chegaralash va tasodifiy son olish uchun tayyor asboblar to'plami.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!