Menu
flag Ar iconالعربيةdown icon

تحويل النص إلى رقم في TypeScript (والرقم إلى نص)

حوّل النص إلى رقم في TypeScript باستخدام Number() أو parseInt() أو parseFloat() أو + الأحادي، وتعرّف على طريقة تعامل كل منها مع مدخلات مثل "42px" و"" و"1e3"، وتحقق من NaN بأمان، وحوّل الأرقام إلى نصوص من جديد.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

لتحويل نص إلى رقم في 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)+sparseInt(s, 10)parseFloat(s)
"42"42424242
"3.99"3.993.9933.99
"42px"NaNNaN4242
""00NaNNaN
" 3 "3333
"1e3"1000100011000
"0x1F"313100
"1,000"NaNNaN11
"12_000"NaNNaN1212
"abc"NaNNaNNaNNaN

القواعد وراء الجدول:

  • 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) أو +snumber (قد يكون 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؟

لا. "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") لفواصل الآلاف.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن