لتحويل نص إلى رقم في TypeScript، استدعِ Number(text). نوع الناتج number، وقيمته NaN عندما لا يكون النص رقمًا صحيحًا. وللنص الذي يحتوي على أحرف لاحقة، مثل "42px"، استخدم parseInt(text, 10) أو parseFloat(text).
طرق التحويل الأربع كلها تعيد النوع number. لا تعرف TypeScript إن كان النص صحيحًا؛ والنص غير الصحيح يعطي number أيضًا، قيمته NaN.
لماذا يجب أن تحوّل
حقول النماذج ومعاملات URL ومتغيرات البيئة ومحتويات الملفات تصل كنصوص. ولن تسمح لك TypeScript باستخدام أحدها حيث يُتوقع رقم:
index.ts(3,23): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
العمليات الحسابية - و* و/ على نص خطأ. أما + فمسموح لكنه يدمج النصوص، فيكون "3" + 10 هو النص "310"، ولهذا يجب أن يأتي التحويل أولًا: Number(quantity) * 10.
ولا يفيد تأكيد النوع أيضًا. يُرفض quantity as number (TS2352)، وفرضه عبر as unknown as number لا يفعل سوى إسكات المترجم: تبقى القيمة نصًا وقت التشغيل.
Number مقابل parseInt مقابل parseFloat مقابل + الأحادي
تتفق الدوال الأربع على المدخلات النظيفة وتختلف في كل ما عداها. هذا الجدول هو الناتج الفعلي لكل منها على Node:
| المدخل | Number(s) | +s | parseInt(s, 10) | parseFloat(s) |
|---|---|---|---|---|
"42" | 42 | 42 | 42 | 42 |
"3.99" | 3.99 | 3.99 | 3 | 3.99 |
"42px" | NaN | NaN | 42 | 42 |
"" | 0 | 0 | NaN | NaN |
" 3 " | 3 | 3 | 3 | 3 |
"1e3" | 1000 | 1000 | 1 | 1000 |
"0x1F" | 31 | 31 | 0 | 0 |
"1,000" | NaN | NaN | 1 | 1 |
"12_000" | NaN | NaN | 12 | 12 |
"abc" | NaN | NaN | NaN | NaN |
القواعد وراء الجدول:
Numberو+الأحادي متطابقان. يحوّلان النص كله بعد حذف المسافات من الطرفين، ويفهمان1e3والنظام الست عشري0x، ويعيدانNaNإذا تبقى أي شيء. النص الفارغ أو المكون من مسافات فقط يصبح0.- يقرأ
parseIntوparseFloatمن البداية ويتوقفان عند أول حرف لا يستطيعان استخدامه، لذلك يعطي"42px"و"1,000"أرقامًا جزئية. والنص الفارغ يعطيNaN. - يحذف
parseIntالجزء الكسري ولا يفهم الأسس:"1e3"يتوقف عندe. - فواصل الأرقام (
12_000) صحيحة في الكود المصدري، لا في النصوص.
Number هو الخيار الأكثر صرامة للتحقق من المدخلات. ويناسب parseInt وparseFloat النصوص التي تحمل فعلًا وحدة أو لاحقة، مثل أحجام CSS.
معالجة المدخلات غير الصحيحة: NaN
نوع NaN هو number، لذلك لا يحذرك المترجم منه أبدًا. تحقق من الناتج بنفسك باستخدام Number.isNaN أو Number.isFinite:
إعادة number | undefined تجعل الفشل جزءًا من النوع، فيجب على كل مستدعٍ معالجته قبل إجراء العمليات الحسابية. ويرفض Number.isFinite أيضًا Infinity، التي يعيدها Number("Infinity") دون تردد.
تجنب isNaN(x) العامة: إنها تحوّل وسيطها أولًا، لذلك isNaN("abc") يساوي true في JavaScript. تعريفها في TypeScript لا يقبل إلا number، فتمرير نص هو الخطأ TS2345، وهذه إشارة إلى استخدام Number.isNaN على قيمة محوّلة مسبقًا.
تحويل النص إلى عدد صحيح
مرّر دائمًا الوسيط الثاني لـ parseInt، وهو الأساس: 10 للنص العشري. إنه اختياري، لكنه يوثّق النية ويهم مع الأسس الأخرى. وللحصول على عدد صحيح من نص عشري، حوّل ثم قرّب صراحة.
يتوقع parseInt نصًا: parseInt(12.7) خطأ ترجمة (TS2345)، وهذا مفيد، لأن parseInt في JavaScript يحوّل الرقم إلى نص أولًا ويعطي نتائج خاطئة لقيم مثل 0.0000005 (يعيد 5). استخدم Math.trunc مع الأرقام. وللأعداد الصحيحة التي تتجاوز Number.MAX_SAFE_INTEGER، يحلل BigInt(text) القيمة الكاملة (ويرمي SyntaxError مع النص غير الصحيح بدل إعادة NaN).
تحويل الرقم إلى نص
كل من String(n) وn.toString() و`${n}` يحوّل الرقم إلى أقصر صيغة نصية له. وتعطي دوال التنسيق تحكمًا أكبر:
يقرّب toFixed القيمة الثنائية لا العدد العشري الذي كتبته، لذلك (1.005).toFixed(2) يساوي "1.00": تُخزَّن 1.005 كقيمة أقل بقليل من 1.005. وللمبالغ المالية، احتفظ بالمبالغ كسنتات صحيحة أو نسّقها بـ Intl.NumberFormat.
يعمل String(n) أيضًا مع null وundefined (فيعطي "null" و"undefined")، بينما يكون n.toString() خطأ ترجمة تحت strict، لأن القيمة قد تكون غائبة.
مرجع سريع
| المهمة | الكود | نوع الناتج |
|---|---|---|
| نص إلى رقم بصرامة | Number(s) أو +s | number (قد يكون NaN) |
| عدد صحيح في بداية النص | parseInt(s, 10) | number (قد يكون NaN) |
| عدد عشري في بداية النص | parseFloat(s) | number (قد يكون NaN) |
| التحقق من الناتج | Number.isFinite(n) وNumber.isNaN(n) | boolean |
| عدد صحيح كبير | BigInt(s) | bigint |
| رقم إلى نص | String(n) وn.toString() و`${n}` | string |
| منازل عشرية ثابتة | n.toFixed(2) | string |
| أساس آخر | n.toString(16) | string |
| فواصل الآلاف | n.toLocaleString("en-US") | string |
الأسئلة الشائعة
كيف أحوّل نصًا إلى رقم في TypeScript؟
استخدم Number(text). يعيد number: القيمة للنص الرقمي الصحيح، وNaN لأي شيء آخر، و0 للنص الفارغ أو الذي يحتوي على مسافات فقط. واستخدم parseInt(text, 10) أو parseFloat(text) عندما قد يحتوي النص على أحرف لاحقة مثل "42px".
هل يمكنني تحويل نص إلى رقم باستخدام as number؟
as number؟لا. "42" as number خطأ ترجمة (TS2352)، وحتى عند فرضه عبر unknown فإن التأكيد لا يغيّر إلا النوع الذي يراه المترجم: تبقى القيمة هي النص "42" وقت التشغيل. حوّل القيمة بـ Number() أو parseInt() أو parseFloat().
ما الفرق بين Number() و parseInt() في TypeScript؟
يحوّل Number النص كله ويعيد NaN إذا كان أي جزء منه غير رقمي، لذلك Number("42px") يساوي NaN. أما parseInt فيقرأ الأرقام من البداية ويتوقف عند أول حرف غير رقمي، لذلك parseInt("42px", 10) يساوي 42، ويحذف الكسور. Number("") يساوي 0، بينما parseInt("") يساوي NaN.
كيف أتحقق من أن النص رقم صحيح؟
حوّله واختبر الناتج: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. فحص النص الفارغ مهم لأن Number("") يساوي 0. استخدم Number.isNaN لا isNaN العامة، التي لا تقبلها TypeScript إلا مع وسيط من نوع number على أي حال.
كيف أحوّل رقمًا إلى نص في TypeScript؟
String(n) وn.toString() وtemplate literal مثل `${n}` تعطي كلها النتيجة نفسها. استخدم n.toFixed(2) لعدد ثابت من المنازل العشرية، وn.toString(16) لأساس آخر، وn.toLocaleString("en-US") لفواصل الآلاف.