الفرق بين المراجعتين ل"Ruby/Kernel/sprintf"

من موسوعة حسوب
< Ruby‏ | Kernel
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>sprintf‎</code> الخاص بالصنف <code>Kernel</code> في روبي}}</noinclude> تصنيف: Ruby تصن...')
 
(تدقيق.)
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 3: سطر 3:
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Kernel]]
 
[[تصنيف: Ruby Kernel]]
يعيد التابع sprintf السلسلة النصية الناتجة من تطبيق format_string على الوسائط الإضافية. داخل سلسلة التنسيق، يتم نسخ كل الأحرف في النتيجة باستثناء تسلسلات الشكل .
+
يعيد التابع <code>sprintf</code> السلسلة النصية المُمرَّرة إليه بعد تنسيقها بنمط معيَّن. داخل سلسلة التنسيق، تُنسَخ كل محارفها في السلسلة النصية الناتجة باستثناء سلسلة التنسيق (format sequences).
صياغة تسلسل التنسيق هو كالآتي.
+
==البنية العامة==
<syntaxhighlight lang="ruby">%[flags][width][.precision]type‎</syntaxhighlight>
+
<syntaxhighlight lang="ruby">sprintf(format_string [, arguments...] )  → string‎</syntaxhighlight>
يتألف تسلسل التنسيق من علامة النسبة المئوية (%)، متبوعة برايات اختيارية، وحقل width، ومحددات الدقة precision، ثم يُقفل بحرف نوع الحقل. يتحكم نوع الحقل في كيفية تفسير الوسائط <code>sprintf</code> المقابلة، بينما تعدّل الرايات تأويلها.
+
==المعاملات==
احرف نوع الحقل هي:
+
===<code>format_string‎</code>===
<syntaxhighlight lang="ruby">Field |  Integer Format
+
السلسلة التي تحدد التنسيق. داخل سلسلة التنسيق <code>format_string</code>، ستُنسخ كل المحارف إلى السلسلة النصية الناتجة باستثناء سلسلة التنسيق (format sequences).
------+--------------------------------------------------------------
+
 
  b  | Convert argument as a binary number.
+
صيغة سلسلة محارف التنسيق تأخذ الشكل التالي:<syntaxhighlight lang="ruby">%[flags][width][.precision]type‎</syntaxhighlight>تتألف سلسلة محارف التنسيق من علامة النسبة المئوية، متبوعةً بثلاث حقول اختيارية هي: <code>flags</code> و <code>width</code> و <code>precision</code> ثم تنتهي بمحرف يحدد حقل النوع <code>type</code>.  يتحكم حثل النوع في كيفية تأويل الوسيط المقابل <code>sprintf</code>، بينما تعدل الحقول <code>flags</code> ذلك التأويل.
      | Negative numbers will be displayed as a two's complement
 
      | prefixed with `..1'.
 
  B  | Equivalent to `b', but uses an uppercase 0B for prefix
 
      | in the alternative format by #.
 
  d  | Convert argument as a decimal number.
 
  i  | Identical to `d'.
 
  o  | Convert argument as an octal number.
 
      | Negative numbers will be displayed as a two's complement
 
      | prefixed with `..7'.
 
  u  | Identical to `d'.
 
  x  | Convert argument as a hexadecimal number.
 
      | Negative numbers will be displayed as a two's complement
 
      | prefixed with `..f' (representing an infinite string of
 
      | leading 'ff's).
 
  X  | Equivalent to `x', but uses uppercase letters.
 
Field |  Float Format
 
------+--------------------------------------------------------------
 
  e  | Convert floating point argument into exponential notation
 
      | with one digit before the decimal point as [-]d.dddddde[+-]dd.
 
      | The precision specifies the number of digits after the decimal
 
      | point (defaulting to six).
 
  E  | Equivalent to `e', but uses an uppercase E to indicate
 
      | the exponent.
 
  f  | Convert floating point argument as [-]ddd.dddddd,
 
      | where the precision specifies the number of digits after
 
      | the decimal point.
 
  g  | Convert a floating point number using exponential form
 
      | if the exponent is less than -4 or greater than or
 
      | equal to the precision, or in dd.dddd form otherwise.
 
      | The precision specifies the number of significant digits.
 
  G  | Equivalent to `g', but use an uppercase `E' in exponent form.
 
  a  | Convert floating point argument as [-]0xh.hhhhp[+-]dd,
 
      | which is consisted from optional sign, "0x", fraction part
 
      | as hexadecimal, "p", and exponential part as decimal.
 
  A  | Equivalent to `a', but use uppercase `X' and `P'.
 
Field |  Other Format
 
------+--------------------------------------------------------------
 
  c  | Argument is the numeric code for a single character or
 
      | a single character string itself.
 
  p  | The valuing of argument.inspect.
 
  s  | Argument is a string to be substituted.  If the format
 
      | sequence contains a precision, at most that many characters
 
      | will be copied.
 
  %  | A percent sign itself will be displayed.  No argument taken.‎</syntaxhighlight>
 
تعدل الرايات سلوك التنسيقات. أحرف الراية هي:
 
<syntaxhighlight lang="ruby">Flag    | Applies to    | Meaning
 
---------+---------------+-----------------------------------------
 
space    | bBdiouxX      | Leave a space at the start of
 
        | aAeEfgG      | non-negative numbers.
 
        | (numeric fmt) | For `o', `x', `X', `b' and `B', use
 
        |              | a minus sign with absolute value for
 
        |              | negative values.
 
---------+---------------+-----------------------------------------
 
(digit)$ | all          | Specifies the absolute argument number
 
        |              | for this fieldAbsolute and relative
 
        |              | argument numbers cannot be mixed in a
 
        |              | sprintf string.
 
---------+---------------+-----------------------------------------
 
#      | bBoxX        | Use an alternative format.
 
        | aAeEfgG      | For the conversions `o', increase the precision
 
        |              | until the first digit will be `0' if
 
        |              | it is not formatted as complements.
 
        |              | For the conversions `x', `X', `b' and `B'
 
        |              | on non-zero, prefix the result with ``0x'',
 
        |              | ``0X'', ``0b'' and ``0B'', respectively.
 
        |              | For `a', `A', `e', `E', `f', `g', and 'G',
 
        |              | force a decimal point to be added,
 
        |              | even if no digits follow.
 
        |              | For `g' and 'G', do not remove trailing zeros.
 
---------+---------------+-----------------------------------------
 
+        | bBdiouxX      | Add a leading plus sign to non-negative
 
        | aAeEfgG      | numbers.
 
        | (numeric fmt) | For `o', `x', `X', `b' and `B', use
 
        |              | a minus sign with absolute value for
 
        |              | negative values.
 
---------+---------------+-----------------------------------------
 
-        | all          | Left-justify the result of this conversion.
 
---------+---------------+-----------------------------------------
 
0 (zero) | bBdiouxX      | Pad with zeros, not spaces.
 
        | aAeEfgG      | For `o', `x', `X', `b' and `B', radix-1
 
        | (numeric fmt) | is used for negative numbers formatted as
 
        |              | complements.
 
---------+---------------+-----------------------------------------
 
*        | all          | Use the next argument as the field width.
 
        |              | If negative, left-justify the result. If the
 
        |              | asterisk is followed by a number and a dollar
 
        |              | sign, use the indicated argument as the width.‎</syntaxhighlight>
 
أمثلة على الرايات:
 
  
الحقل width هو عدد صحيح اختياري، متبوعًا اختياريًا بنقطة ودقة (precision).  يحدد width الحد الأدنى لعدد الأحرف التي ستُكتب في النتيجة الخاصة بهذا الحقل.
+
محارف حقل النوع <code>type</code> هي:
أمثلة على width:
+
{| class="wikitable"
 +
!حقل النوع
 +
!تنسيق الأعداد الصحيحة
 +
|-
 +
|<code>b</code>
 +
|يحول الوسيط <code>arguments...‎</code> إلى عدد ثنائي (binary number).
 +
الأعداد السالبة ستُعرض كمتمم ثنائي مع البادئة "<code>‎..1</code>‎".
 +
|-
 +
|<code>B</code>
 +
|يشبه النوع <code>b</code> إلا أنَّه يستخدم حرفًا كبيرًا <code>0B</code> للبادئة في التنسيق البديل عبر <code>#</code>.
 +
|-
 +
|<code>d</code>
 +
|يحول الوسيط <code>arguments...‎</code> إلى عدد عشري (decimal number).
 +
|-
 +
|<code>i</code>
 +
|مشابه تمامًا للنوع "<code>d</code>".
 +
|-
 +
|<code>o</code>
 +
|يحول الوسيط إلى عدد ثماني (octal number).
 +
الأعداد السالبة ستُعرَض كمتمم ثنائي مع البادئة "<code>‎..7</code>‎".
 +
|-
 +
|<code>u</code>
 +
|مشابه تمامًا للنوع "<code>d</code>".
 +
|-
 +
|<code>x</code>
 +
|يحول الوسيط <code>arguments...‎</code> إلى عدد ست عشري (hexadecimal number).
 +
الأعداد السالبة ستُعرض كمتمم ثنائي مع البادئة "<code>‎..f</code>" (تمثل سلسلة نصية  لا منتهية بالمحارف <code>f</code>).
 +
|-
 +
|<code>X</code>
 +
|مكافئ للنوع <code>x</code> لكن مع استخدام الحروف الكبيرة.
 +
|-
 +
!حقل النوع
 +
!تنسيق الأعداد العشرية
 +
|-
 +
|<code>e</code>
 +
|يحول الوسائط <code>arguments...‎</code> العددية الكسرية (floating point) إلى الشكل الأسي مع رقم واحد قبل النقطة العشرية على الشكل ‎<code>[-]d.dddddde[+-]dd</code>.
 +
تحدد الدقة (‎precision) عدد الأرقام بعد النقطة العشرية (القيمة الافتراضية تساوي 6).
 +
|-
 +
|<code>E</code>
 +
|يكافئ "<code>e</code>"  لكن يستخدم الحرف <code>E</code> الكبير للدلالة على الأس.
 +
|-
 +
|<code>f</code>
 +
|يحول الوسائط <code>arguments...‎</code> العددية الكسرية إلى الشكل الأسي بالشكل ‎<code>[-]ddd.dddddd</code>، حيث تحدد الدقة عدد الأرقام بعد النقطة العشرية.
 +
|-
 +
|<code>g</code>
 +
|يحول الوسائط <code>arguments...‎</code> العددية الكسرية (floating point) باستخدام الشكل الأسي إن كان الأسّ أصغر من ‎ <code>-4</code>‎أو أكبر من أو يساوي الدقة (precision)، أو يحوله إلى الشكل <code>dd.dddd</code> خلاف ذلك.
 +
تحدد الدقة (‎precision) عدد الأرقام المهمة (significant digits).
 +
|-
 +
|<code>G</code>
 +
|يكافئ "<code>g</code>"  لكن يستخدم الحرف <code>E</code> الكبير للدلالة على الأس.
 +
|-
 +
|<code>a</code>
 +
|يحول الوسائط <code>arguments...‎</code> العددية الكسرية إلى الشكل ‎،<code>[-]0xh.hhhhp[+-]dd</code> والذي يتألف من علامة إشارة اختيارية  و "<code>0x</code>" و والجزء الكسري على الشكل الست عشري و "<code>p</code>" والجزء الأسي على شكل عدد عشري.
 +
|-
 +
|<code>A</code>
 +
|يكافئ "<code>a</code>"  لكن يستخدم الحرفين <code>X</code> و <code>P</code> الكبيرين.
 +
|-
 +
!حقل النوع
 +
!تنسيقات أخرى
 +
|-
 +
|<code>c</code>
 +
|الوسيط <code>arguments...‎</code> هو شيفرة رقمية لحرف واحد أو سلسلة نصية.
 +
|-
 +
|<code>p</code>
 +
|قيمة التعبير <code>argument.inspect</code>.
 +
|-
 +
|<code>s</code>
 +
|الوسيط <code>arguments...‎</code> هو سلسلة نصية يراد استبدالها. إن احتوى شكل التنسيق على دقة محددة (precision)، فسيكون عدد الأحرف المنسوخة أصغر من تلك الدقة.
 +
|-
 +
|<code>%</code>
 +
|ستُعرض علامة النسبة المئوية بنفسها، ولن تأخذ مكان أي وسيط.
 +
|}تعدل الحقول <code>flags</code> سلوك عملية التنسيق. الرايات التي يمكن استعمال مع الحقل <code>flag</code> هي كالتالي:
 +
{| class="wikitable"
 +
!الراية
 +
!تطبق على
 +
!شرح
 +
|-
 +
|مسافة            بيضاء
 +
|bBdiouxX
 +
aAeEfgG
  
بالنسبة للحقول العددية، تتحكم الدقة (precision) في عدد المنازل العشرية المعروضة. بالنسبة للحقول النصية، تحدد الدقة الحد الأقصى لعدد الأحرف التي ستُنسخ من السلسلة النصية. (وهكذا ، فإن تسلسل التنسيق <code>%10.10s</code> سيساهم دائمًا بعشرة أحرف بالضبط في النتيجة.)
+
(numeric fmt)
أمثلة على الدقة:
+
|يترك مسافة بيضاء في بداية الأعداد غير السالبة.
 +
بالنسبة للتحويلات 'o' و 'x' و 'X' و 'b' و 'B'، تُستخدم علامة الإشارة ناقص مع القيمة المطلقة للأعداد السالبة.
 +
|-
 +
|<code>(digit)$</code>
 +
|الكل
 +
|يحدد قيمة الوسيط المطلقة (absolute argument number) لهذا الحقل. قيم الوسيط المطلقة والنسبية لا يمكن خلطها في النصوص المراد طباعتها عبر <code>sprintf</code>.
 +
|-
 +
|<code>#</code>
 +
|bBoxX
 +
aAeEfgG
 +
|تستخدم تنسيقًا بديلًا.
 +
بالنسبة للتحويل '<code>o</code>'، ترفع الدقة إلى أن يصير الرقم الأول '<code>0</code>'  إن لم يتم تنسيقه كمتمم (complements).
  
أمثلة:
+
بالنسبة للتحويلات  'x' و 'X' و 'b' و 'B'، بالنسبة للأعداد المخالفة للصفر، تُبدأ النتيجة بالبادئة
  
للتنسيقات الأكثر تعقيدًا، تدعم روبي المراجع الاسمية (reference by name). يستخدم النمط <name> s نمط التنسيق ، على خلاف النمط ٪ {name}.
+
<code><nowiki>''</nowiki>0x<nowiki>''</nowiki></code>و <code><nowiki>''</nowiki>0X<nowiki>''</nowiki></code> و <code><nowiki>''</nowiki>0b<nowiki>''</nowiki></code> و <code><nowiki>''</nowiki>0B<nowiki>''</nowiki></code> على التوالي.
أمثلة:
 
==البنية العامة==
 
<syntaxhighlight lang="ruby">sprintf(format_string [, arguments...] ) → string‎</syntaxhighlight>
 
==المعاملات==
 
===<code>format_string‎</code>===
 
  
===<code>arguments...‎</code>===
+
بالنسبة لتحويلات 'a' و 'A' و 'e' و 'E' و 'f' و 'g' و 'G'، تُفرض إضافة النقطة العشرية، حتى لو لم يكن بعدها أي أرقام.
  
 +
بالنسبة للتحويلات 'g' و  'G'، لا تزال الأصفار الإضافية.
 +
|-
 +
|<code>+</code>
 +
|bBdiouxX
 +
aAeEfgG
  
==القيمة المُعادة==
+
(numeric fmt)
 +
|تضاف العلامة <code>+</code> في بداية الأعداد الموجبة.
 +
بالنسبة للتحويلات 'o' و 'x' و 'X' و 'b' و 'B'، تُستخدم علامة إشارة السالبة <code>-</code> مع القيمة المطلقة للأعداد السالبة.
 +
|-
 +
|<code>-</code>
 +
|الكل
 +
|تعدِّل نتيحة تنسيق السلسلة النصية إلى الجهة اليسرى.
 +
|-
 +
|<code>0</code>
 +
|bBdiouxX
 +
aAeEfgG
  
==أمثلة==
+
(numeric fmt)
مثال على استخدام التابع <code>sprintf‎</code>:
+
|تملأ المنازل الرقمية الفارغة بالأصفار، وليس المسافات البيضاء.
<syntaxhighlight lang="ruby"># `+' and space flag specifies the sign of non-negative numbers.
+
بالنسبة للتحويلات 'o' و 'x' و 'X' و 'b' و 'B'، تُستخدم الأساسradix-1  للأعداد السالبة المُنسّقة على شكل متممات.
 +
|-
 +
|<code>*</code>
 +
|الكل
 +
|يستخدم الوسيط الموالي كعرض للسلسلة النصية المراد تنسيقها. إن كان سالبًا، فستعدل نتيحة التحويل إلى الجهة اليسرى. إن اتبِعت العلامة <code>*</code> بعدد وبالعلامة <code>$</code>، فسيُستخدم الوسيط كعرض للسلسلة النصية.
 +
|}أمثلة على استعمال الرايات <code>flags</code>:<syntaxhighlight lang="ruby"># `+' and space flag specifies the sign of non-negative numbers.
 
sprintf("%d", 123)  #=> "123"
 
sprintf("%d", 123)  #=> "123"
 
sprintf("%+d", 123) #=> "+123"
 
sprintf("%+d", 123) #=> "+123"
 
sprintf("% d", 123) #=> " 123"
 
sprintf("% d", 123) #=> " 123"
 +
 
# `#' flag for `o' increases number of digits to show `0'.
 
# `#' flag for `o' increases number of digits to show `0'.
 
# `+' and space flag changes format of negative numbers.
 
# `+' and space flag changes format of negative numbers.
سطر 133: سطر 151:
 
sprintf("%o", -123)  #=> "..7605"
 
sprintf("%o", -123)  #=> "..7605"
 
sprintf("%#o", -123) #=> "..7605"
 
sprintf("%#o", -123) #=> "..7605"
 +
 
# `#' flag for `x' add a prefix `0x' for non-zero numbers.
 
# `#' flag for `x' add a prefix `0x' for non-zero numbers.
 
# `+' and space flag disables complements for negative numbers.
 
# `+' and space flag disables complements for negative numbers.
سطر 141: سطر 160:
 
sprintf("%#x", -123) #=> "0x..f85"
 
sprintf("%#x", -123) #=> "0x..f85"
 
sprintf("%#x", 0)    #=> "0"
 
sprintf("%#x", 0)    #=> "0"
 +
 
# `#' for `X' uses the prefix `0X'.
 
# `#' for `X' uses the prefix `0X'.
 
sprintf("%X", 123)  #=> "7B"
 
sprintf("%X", 123)  #=> "7B"
 
sprintf("%#X", 123) #=> "0X7B"
 
sprintf("%#X", 123) #=> "0X7B"
 +
 
# `#' flag for `b' add a prefix `0b' for non-zero numbers.
 
# `#' flag for `b' add a prefix `0b' for non-zero numbers.
 
# `+' and space flag disables complements for negative numbers.
 
# `+' and space flag disables complements for negative numbers.
سطر 152: سطر 173:
 
sprintf("%#b", -123) #=> "0b..10000101"
 
sprintf("%#b", -123) #=> "0b..10000101"
 
sprintf("%#b", 0)    #=> "0"
 
sprintf("%#b", 0)    #=> "0"
 +
 
# `#' for `B' uses the prefix `0B'.
 
# `#' for `B' uses the prefix `0B'.
 
sprintf("%B", 123)  #=> "1111011"
 
sprintf("%B", 123)  #=> "1111011"
 
sprintf("%#B", 123) #=> "0B1111011"
 
sprintf("%#B", 123) #=> "0B1111011"
 +
 
# `#' for `e' forces to show the decimal point.
 
# `#' for `e' forces to show the decimal point.
 
sprintf("%.0e", 1)  #=> "1e+00"
 
sprintf("%.0e", 1)  #=> "1e+00"
 
sprintf("%#.0e", 1) #=> "1.e+00"
 
sprintf("%#.0e", 1) #=> "1.e+00"
 +
 
# `#' for `f' forces to show the decimal point.
 
# `#' for `f' forces to show the decimal point.
 
sprintf("%.0f", 1234)  #=> "1234"
 
sprintf("%.0f", 1234)  #=> "1234"
 
sprintf("%#.0f", 1234) #=> "1234."
 
sprintf("%#.0f", 1234) #=> "1234."
 +
 
# `#' for `g' forces to show the decimal point.
 
# `#' for `g' forces to show the decimal point.
 
# It also disables stripping lowest zeros.
 
# It also disables stripping lowest zeros.
سطر 166: سطر 191:
 
sprintf("%#g", 123.4)  #=> "123.400"
 
sprintf("%#g", 123.4)  #=> "123.400"
 
sprintf("%g", 123456)  #=> "123456"
 
sprintf("%g", 123456)  #=> "123456"
sprintf("%#g", 123456) #=> "123456."‎</syntaxhighlight>
+
sprintf("%#g", 123456) #=> "123456."</syntaxhighlight>الحقل <code>width</code> هو عدد صحيح اختياري يُتبَع اختياريًا بنقطة وبقيمة تمثِّل حقل الدقة <code>precision</code>.  يحدد الحقل <code>width</code> الحد الأدنى لعدد محارف السلسلة النصية الناتجة.
 +
 
 +
أمثلة على الحقل <code>width</code>:<syntaxhighlight lang="ruby"># padding is done by spaces,      width=20
 +
# 0 or radix-1.            <------------------>
 +
sprintf("%20d", 123)  #=> "                123"
 +
sprintf("%+20d", 123)  #=> "                +123"
 +
sprintf("%020d", 123)  #=> "00000000000000000123"
 +
sprintf("%+020d", 123) #=> "+0000000000000000123"
 +
sprintf("% 020d", 123) #=> " 0000000000000000123"
 +
sprintf("%-20d", 123)  #=> "123                "
 +
sprintf("%-+20d", 123) #=> "+123                "
 +
sprintf("%- 20d", 123) #=> " 123                "
 +
sprintf("%020x", -123) #=> "..ffffffffffffffff85"
 +
</syntaxhighlight>بالنسبة للحقول العددية، يتحكم الحقل <code>precision</code> في عدد المنازل العشرية المعروضة (دقة العدد العشري). بالنسبة للحقول النصية، يحدد الحقل <code>precision</code> الحد الأقصى لعدد الأحرف التي ستُنسخ من السلسلة (بناءً على ذلك، فإن سلسلة التنسيق <code>%10.10s</code> ستخصص دائمًا عشرة أحرف بالضبط للسلسلة النصية المعادة).
 +
 
 +
أمثلة على الحقل <code>precision</code>:<syntaxhighlight lang="ruby"># precision for `d', 'o', 'x' and 'b' is
 +
# minimum number of digits              <------>
 +
sprintf("%20.8d", 123)  #=> "            00000123"
 +
sprintf("%20.8o", 123)  #=> "            00000173"
 +
sprintf("%20.8x", 123)  #=> "            0000007b"
 +
sprintf("%20.8b", 123)  #=> "            01111011"
 +
sprintf("%20.8d", -123) #=> "          -00000123"
 +
sprintf("%20.8o", -123) #=> "            ..777605"
 +
sprintf("%20.8x", -123) #=> "            ..ffff85"
 +
sprintf("%20.8b", -11)  #=> "            ..110101"
 +
 
 +
# "0x" and "0b" for `#x' and `#b' is not counted for
 +
# precision but "0" for `#o' is counted.  <------>
 +
sprintf("%#20.8d", 123)  #=> "            00000123"
 +
sprintf("%#20.8o", 123)  #=> "            00000173"
 +
sprintf("%#20.8x", 123)  #=> "          0x0000007b"
 +
sprintf("%#20.8b", 123)  #=> "          0b01111011"
 +
sprintf("%#20.8d", -123) #=> "          -00000123"
 +
sprintf("%#20.8o", -123) #=> "            ..777605"
 +
sprintf("%#20.8x", -123) #=> "          0x..ffff85"
 +
sprintf("%#20.8b", -11)  #=> "          0b..110101"
 +
 
 +
# precision for `e' is number of
 +
# digits after the decimal point          <------>
 +
sprintf("%20.8e", 1234.56789) #=> "      1.23456789e+03"
 +
 
 +
# precision for `f' is number of
 +
# digits after the decimal point              <------>
 +
sprintf("%20.8f", 1234.56789) #=> "      1234.56789000"
 +
 
 +
# precision for `g' is number of
 +
# significant digits                          <------->
 +
sprintf("%20.8g", 1234.56789) #=> "          1234.5679"
 +
 
 +
#                                        <------->
 +
sprintf("%20.8g", 123456789)  #=> "      1.2345679e+08"
 +
 
 +
# precision for `s' is
 +
# maximum number of characters                    <------>
 +
sprintf("%20.8s", "string test") #=> "            string t"
 +
</syntaxhighlight><span> </span>بالنسبة للتنسيقات الأكثر تعقيدًا، تدعم روبي المراجع الاسمية (reference by name). حيث يستخدم النمط ‎<code>%<name>s</code> نمط التنسيق (format style)، وذلك على خلافًا للنمط <code>{name‎}%</code>.
 +
===<code>arguments...‎</code>===
 +
المحارف التي ستمرر إلى سلسلة التنسيق <code>format_string‎</code> لتنسيقها قبل إعادتها.
 +
==القيمة المعادة==
 +
تُعاد سلسلة نصية تحوي قيمة المعاملات <code>arguments...‎</code> المعطاة بعد تنسيقها وفقًا لسلسلة التنسيق <code>format_string‎</code>.
 +
==أمثلة==
 +
مثال على استخدام التابع <code>sprintf‎</code>:<syntaxhighlight lang="ruby">sprintf("%d %04x", 123, 123)              #=> "123 007b"
 +
sprintf("%08b '%4s'", 123, 123)            #=> "01111011 ' 123'"
 +
sprintf("%1$*2$s %2$d %1$s", "hello", 8)  #=> "  hello 8 hello"
 +
sprintf("%1$*2$s %2$d", "hello", -8)      #=> "hello    -8"
 +
sprintf("%+g:% g:%-g", 1.23, 1.23, 1.23)  #=> "+1.23: 1.23:1.23"
 +
sprintf("%u", -123)                        #=> "-123"
 +
 
 +
sprintf("%<foo>d : %<bar>f", { :foo => 1, :bar => 2 })
 +
  #=> 1 : 2.000000
 +
sprintf("%{foo}f", { :foo => 1 })
 +
  # => "1f"</syntaxhighlight>
 
==انظر أيضا==
 
==انظر أيضا==
* التابع <code>[[Ruby/Kernel/spawn|spawn]]</code>: ينفذ التابع spawn تعليمة محددة، ثم يعيد معرفها (pid).
+
* التابع <code>[[Ruby/Kernel/format|format]]</code>: ينسق السلسلة النصية المعطاة ثم يعيدها.
* التابع <code>[[Ruby/Kernel/srand|srand]]</code>: يحدد التابع srand بذرة مولد الأعداد شبه العشوائية (system pseudo-random number generator)، حيث يعين Random :: DEFAULT ، ويعطيها القيمة <code>number</code>.  تُعاد قيمة البذرة السابقة.
 
  
 
==مصادر==
 
==مصادر==
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-sprintf قسم التابع sprintf‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]
+
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-sprintf قسم التابع sprintf‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 05:09، 17 نوفمبر 2018

يعيد التابع sprintf السلسلة النصية المُمرَّرة إليه بعد تنسيقها بنمط معيَّن. داخل سلسلة التنسيق، تُنسَخ كل محارفها في السلسلة النصية الناتجة باستثناء سلسلة التنسيق (format sequences).

البنية العامة

sprintf(format_string [, arguments...] )   string

المعاملات

format_string‎

السلسلة التي تحدد التنسيق. داخل سلسلة التنسيق format_string، ستُنسخ كل المحارف إلى السلسلة النصية الناتجة باستثناء سلسلة التنسيق (format sequences).

صيغة سلسلة محارف التنسيق تأخذ الشكل التالي:

%[flags][width][.precision]type

تتألف سلسلة محارف التنسيق من علامة النسبة المئوية، متبوعةً بثلاث حقول اختيارية هي: flags و width و precision ثم تنتهي بمحرف يحدد حقل النوع type. يتحكم حثل النوع في كيفية تأويل الوسيط المقابل sprintf، بينما تعدل الحقول flags ذلك التأويل.

محارف حقل النوع type هي:

حقل النوع تنسيق الأعداد الصحيحة
b يحول الوسيط arguments...‎ إلى عدد ثنائي (binary number).

الأعداد السالبة ستُعرض كمتمم ثنائي مع البادئة "‎..1‎".

B يشبه النوع b إلا أنَّه يستخدم حرفًا كبيرًا 0B للبادئة في التنسيق البديل عبر #.
d يحول الوسيط arguments...‎ إلى عدد عشري (decimal number).
i مشابه تمامًا للنوع "d".
o يحول الوسيط إلى عدد ثماني (octal number).

الأعداد السالبة ستُعرَض كمتمم ثنائي مع البادئة "‎..7‎".

u مشابه تمامًا للنوع "d".
x يحول الوسيط arguments...‎ إلى عدد ست عشري (hexadecimal number).

الأعداد السالبة ستُعرض كمتمم ثنائي مع البادئة "‎..f" (تمثل سلسلة نصية لا منتهية بالمحارف f).

X مكافئ للنوع x لكن مع استخدام الحروف الكبيرة.
حقل النوع تنسيق الأعداد العشرية
e يحول الوسائط arguments...‎ العددية الكسرية (floating point) إلى الشكل الأسي مع رقم واحد قبل النقطة العشرية على الشكل ‎[-]d.dddddde[+-]dd.

تحدد الدقة (‎precision) عدد الأرقام بعد النقطة العشرية (القيمة الافتراضية تساوي 6).

E يكافئ "e" لكن يستخدم الحرف E الكبير للدلالة على الأس.
f يحول الوسائط arguments...‎ العددية الكسرية إلى الشكل الأسي بالشكل ‎[-]ddd.dddddd، حيث تحدد الدقة عدد الأرقام بعد النقطة العشرية.
g يحول الوسائط arguments...‎ العددية الكسرية (floating point) باستخدام الشكل الأسي إن كان الأسّ أصغر من ‎ -4‎أو أكبر من أو يساوي الدقة (precision)، أو يحوله إلى الشكل dd.dddd خلاف ذلك.

تحدد الدقة (‎precision) عدد الأرقام المهمة (significant digits).

G يكافئ "g" لكن يستخدم الحرف E الكبير للدلالة على الأس.
a يحول الوسائط arguments...‎ العددية الكسرية إلى الشكل ‎،[-]0xh.hhhhp[+-]dd والذي يتألف من علامة إشارة اختيارية و "0x" و والجزء الكسري على الشكل الست عشري و "p" والجزء الأسي على شكل عدد عشري.
A يكافئ "a" لكن يستخدم الحرفين X و P الكبيرين.
حقل النوع تنسيقات أخرى
c الوسيط arguments...‎ هو شيفرة رقمية لحرف واحد أو سلسلة نصية.
p قيمة التعبير argument.inspect.
s الوسيط arguments...‎ هو سلسلة نصية يراد استبدالها. إن احتوى شكل التنسيق على دقة محددة (precision)، فسيكون عدد الأحرف المنسوخة أصغر من تلك الدقة.
% ستُعرض علامة النسبة المئوية بنفسها، ولن تأخذ مكان أي وسيط.

تعدل الحقول flags سلوك عملية التنسيق. الرايات التي يمكن استعمال مع الحقل flag هي كالتالي:

الراية تطبق على شرح
مسافة بيضاء bBdiouxX

aAeEfgG

(numeric fmt)

يترك مسافة بيضاء في بداية الأعداد غير السالبة.

بالنسبة للتحويلات 'o' و 'x' و 'X' و 'b' و 'B'، تُستخدم علامة الإشارة ناقص مع القيمة المطلقة للأعداد السالبة.

(digit)$ الكل يحدد قيمة الوسيط المطلقة (absolute argument number) لهذا الحقل. قيم الوسيط المطلقة والنسبية لا يمكن خلطها في النصوص المراد طباعتها عبر sprintf.
# bBoxX

aAeEfgG

تستخدم تنسيقًا بديلًا.

بالنسبة للتحويل 'o'، ترفع الدقة إلى أن يصير الرقم الأول '0' إن لم يتم تنسيقه كمتمم (complements).

بالنسبة للتحويلات 'x' و 'X' و 'b' و 'B'، بالنسبة للأعداد المخالفة للصفر، تُبدأ النتيجة بالبادئة

''0x''و ''0X'' و ''0b'' و ''0B'' على التوالي.

بالنسبة لتحويلات 'a' و 'A' و 'e' و 'E' و 'f' و 'g' و 'G'، تُفرض إضافة النقطة العشرية، حتى لو لم يكن بعدها أي أرقام.

بالنسبة للتحويلات 'g' و 'G'، لا تزال الأصفار الإضافية.

+ bBdiouxX

aAeEfgG

(numeric fmt)

تضاف العلامة + في بداية الأعداد الموجبة.

بالنسبة للتحويلات 'o' و 'x' و 'X' و 'b' و 'B'، تُستخدم علامة إشارة السالبة - مع القيمة المطلقة للأعداد السالبة.

- الكل تعدِّل نتيحة تنسيق السلسلة النصية إلى الجهة اليسرى.
0 bBdiouxX

aAeEfgG

(numeric fmt)

تملأ المنازل الرقمية الفارغة بالأصفار، وليس المسافات البيضاء.

بالنسبة للتحويلات 'o' و 'x' و 'X' و 'b' و 'B'، تُستخدم الأساسradix-1 للأعداد السالبة المُنسّقة على شكل متممات.

* الكل يستخدم الوسيط الموالي كعرض للسلسلة النصية المراد تنسيقها. إن كان سالبًا، فستعدل نتيحة التحويل إلى الجهة اليسرى. إن اتبِعت العلامة * بعدد وبالعلامة $، فسيُستخدم الوسيط كعرض للسلسلة النصية.

أمثلة على استعمال الرايات flags:

# `+' and space flag specifies the sign of non-negative numbers.
sprintf("%d", 123)  #=> "123"
sprintf("%+d", 123) #=> "+123"
sprintf("% d", 123) #=> " 123"

# `#' flag for `o' increases number of digits to show `0'.
# `+' and space flag changes format of negative numbers.
sprintf("%o", 123)   #=> "173"
sprintf("%#o", 123)  #=> "0173"
sprintf("%+o", -123) #=> "-173"
sprintf("%o", -123)  #=> "..7605"
sprintf("%#o", -123) #=> "..7605"

# `#' flag for `x' add a prefix `0x' for non-zero numbers.
# `+' and space flag disables complements for negative numbers.
sprintf("%x", 123)   #=> "7b"
sprintf("%#x", 123)  #=> "0x7b"
sprintf("%+x", -123) #=> "-7b"
sprintf("%x", -123)  #=> "..f85"
sprintf("%#x", -123) #=> "0x..f85"
sprintf("%#x", 0)    #=> "0"

# `#' for `X' uses the prefix `0X'.
sprintf("%X", 123)  #=> "7B"
sprintf("%#X", 123) #=> "0X7B"

# `#' flag for `b' add a prefix `0b' for non-zero numbers.
# `+' and space flag disables complements for negative numbers.
sprintf("%b", 123)   #=> "1111011"
sprintf("%#b", 123)  #=> "0b1111011"
sprintf("%+b", -123) #=> "-1111011"
sprintf("%b", -123)  #=> "..10000101"
sprintf("%#b", -123) #=> "0b..10000101"
sprintf("%#b", 0)    #=> "0"

# `#' for `B' uses the prefix `0B'.
sprintf("%B", 123)  #=> "1111011"
sprintf("%#B", 123) #=> "0B1111011"

# `#' for `e' forces to show the decimal point.
sprintf("%.0e", 1)  #=> "1e+00"
sprintf("%#.0e", 1) #=> "1.e+00"

# `#' for `f' forces to show the decimal point.
sprintf("%.0f", 1234)  #=> "1234"
sprintf("%#.0f", 1234) #=> "1234."

# `#' for `g' forces to show the decimal point.
# It also disables stripping lowest zeros.
sprintf("%g", 123.4)   #=> "123.4"
sprintf("%#g", 123.4)  #=> "123.400"
sprintf("%g", 123456)  #=> "123456"
sprintf("%#g", 123456) #=> "123456."

الحقل width هو عدد صحيح اختياري يُتبَع اختياريًا بنقطة وبقيمة تمثِّل حقل الدقة precision. يحدد الحقل width الحد الأدنى لعدد محارف السلسلة النصية الناتجة. أمثلة على الحقل width:

# padding is done by spaces,       width=20
# 0 or radix-1.             <------------------>
sprintf("%20d", 123)   #=> "                 123"
sprintf("%+20d", 123)  #=> "                +123"
sprintf("%020d", 123)  #=> "00000000000000000123"
sprintf("%+020d", 123) #=> "+0000000000000000123"
sprintf("% 020d", 123) #=> " 0000000000000000123"
sprintf("%-20d", 123)  #=> "123                 "
sprintf("%-+20d", 123) #=> "+123                "
sprintf("%- 20d", 123) #=> " 123                "
sprintf("%020x", -123) #=> "..ffffffffffffffff85"

بالنسبة للحقول العددية، يتحكم الحقل precision في عدد المنازل العشرية المعروضة (دقة العدد العشري). بالنسبة للحقول النصية، يحدد الحقل precision الحد الأقصى لعدد الأحرف التي ستُنسخ من السلسلة (بناءً على ذلك، فإن سلسلة التنسيق ‎%10.10s ستخصص دائمًا عشرة أحرف بالضبط للسلسلة النصية المعادة). أمثلة على الحقل precision:

# precision for `d', 'o', 'x' and 'b' is
# minimum number of digits               <------>
sprintf("%20.8d", 123)  #=> "            00000123"
sprintf("%20.8o", 123)  #=> "            00000173"
sprintf("%20.8x", 123)  #=> "            0000007b"
sprintf("%20.8b", 123)  #=> "            01111011"
sprintf("%20.8d", -123) #=> "           -00000123"
sprintf("%20.8o", -123) #=> "            ..777605"
sprintf("%20.8x", -123) #=> "            ..ffff85"
sprintf("%20.8b", -11)  #=> "            ..110101"

# "0x" and "0b" for `#x' and `#b' is not counted for
# precision but "0" for `#o' is counted.  <------>
sprintf("%#20.8d", 123)  #=> "            00000123"
sprintf("%#20.8o", 123)  #=> "            00000173"
sprintf("%#20.8x", 123)  #=> "          0x0000007b"
sprintf("%#20.8b", 123)  #=> "          0b01111011"
sprintf("%#20.8d", -123) #=> "           -00000123"
sprintf("%#20.8o", -123) #=> "            ..777605"
sprintf("%#20.8x", -123) #=> "          0x..ffff85"
sprintf("%#20.8b", -11)  #=> "          0b..110101"

# precision for `e' is number of
# digits after the decimal point           <------>
sprintf("%20.8e", 1234.56789) #=> "      1.23456789e+03"

# precision for `f' is number of
# digits after the decimal point               <------>
sprintf("%20.8f", 1234.56789) #=> "       1234.56789000"

# precision for `g' is number of
# significant digits                          <------->
sprintf("%20.8g", 1234.56789) #=> "           1234.5679"

#                                         <------->
sprintf("%20.8g", 123456789)  #=> "       1.2345679e+08"

# precision for `s' is
# maximum number of characters                    <------>
sprintf("%20.8s", "string test") #=> "            string t"

بالنسبة للتنسيقات الأكثر تعقيدًا، تدعم روبي المراجع الاسمية (reference by name). حيث يستخدم النمط ‎%<name>s نمط التنسيق (format style)، وذلك على خلافًا للنمط {name‎}%.

arguments...‎

المحارف التي ستمرر إلى سلسلة التنسيق format_string‎ لتنسيقها قبل إعادتها.

القيمة المعادة

تُعاد سلسلة نصية تحوي قيمة المعاملات arguments...‎ المعطاة بعد تنسيقها وفقًا لسلسلة التنسيق format_string‎.

أمثلة

مثال على استخدام التابع sprintf‎:

sprintf("%d %04x", 123, 123)               #=> "123 007b"
sprintf("%08b '%4s'", 123, 123)            #=> "01111011 ' 123'"
sprintf("%1$*2$s %2$d %1$s", "hello", 8)   #=> "   hello 8 hello"
sprintf("%1$*2$s %2$d", "hello", -8)       #=> "hello    -8"
sprintf("%+g:% g:%-g", 1.23, 1.23, 1.23)   #=> "+1.23: 1.23:1.23"
sprintf("%u", -123)                        #=> "-123"

sprintf("%<foo>d : %<bar>f", { :foo => 1, :bar => 2 })
  #=> 1 : 2.000000
sprintf("%{foo}f", { :foo => 1 })
  # => "1f"

انظر أيضا

  • التابع format: ينسق السلسلة النصية المعطاة ثم يعيدها.

مصادر