الفرق بين المراجعتين لصفحة: «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> السلسلة النصية الناتجة من تطبيق <code>format_string</code> على الوسائط الإضافية.  داخل سلسلة التنسيق، يتم نسخ كل الأحرف في النتيجة باستثناء تسلسلات التنسيق (format sequences).
صياغة تسلسل التنسيق هو كالآتي.
 
<syntaxhighlight lang="ruby">%[flags][width][.precision]type‎</syntaxhighlight>
صياغة تسلسلات التنسيق تأخذ الشكل الآتي.
يتألف تسلسل التنسيق من علامة النسبة المئوية (%)، متبوعة برايات اختيارية، وحقل width، ومحددات الدقة precision، ثم يُقفل بحرف نوع الحقل.  يتحكم نوع الحقل في كيفية تفسير الوسائط <code>sprintf</code> المقابلة، بينما تعدّل الرايات تأويلها.
<syntaxhighlight lang="ruby">%[flags][width][.precision]type
</syntaxhighlight>
تتألف تسلسلات التنسيق من علامة النسبة المئوية، متبوعة بثلاث حقول اختيارية، <code>flags</code> و <code>width</code> و <code>precision.</code>، ثم تنتهي بحرف يحدد نوع الحقل.  يتحكم نوع الحقل في كيفية تأويل الوسيط المقابل <code>sprintf</code>، بينما تعدل الحقول <code>flags</code> ذلك التأويل.
 
احرف نوع الحقل هي:
احرف نوع الحقل هي:
<syntaxhighlight lang="ruby">Field |  Integer Format
 
------+--------------------------------------------------------------
  b  | Convert argument as a binary number.
      | 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
{| class="wikitable"
---------+---------------+-----------------------------------------
!الحقل
space    | bBdiouxX      | Leave a space at the start of
!التنسيق (Integer)
        | aAeEfgG      | non-negative numbers.
|-
        | (numeric fmt) | For `o', `x', `X', `b' and `B', use
|<code>b</code>
        |               | a minus sign with absolute value for
|يحول الوسيط إلى عدد ثنائي (binary number).
        |               | negative values.
الأعداد السالبة ستُعرض مع البادئة "<code>‎..1</code>‎".
---------+---------------+-----------------------------------------
|-
(digit)$ | all          | Specifies the absolute argument number
|<code>B</code>
        |               | for this field.  Absolute and relative
|مكافئة لـ b، إلا أنها تستخدم حرفًا كبيرا <code>0B</code> كبادئة في الشكل البديل عبر <code>#</code>.
        |               | argument numbers cannot be mixed in a
|-
        |               | sprintf string.
|<code>d</code>
---------+---------------+-----------------------------------------
|يحول الوسيط إلى عدد عشري (decimal number).
#      | bBoxX        | Use an alternative format.
|-
        | aAeEfgG      | For the conversions `o', increase the precision
|<code>i</code>
        |               | until the first digit will be `0' if
|مشابه لـ "<code>d</code>"
        |               | it is not formatted as complements.
|-
        |               | For the conversions `x', `X', `b' and `B'
|<code>o</code>
        |               | on non-zero, prefix the result with ``0x'',
|يحول الوسيط إلى عدد ثماني (octal number).
        |               | ``0X'', ``0b'' and ``0B'', respectively.
الأعداد السالبة ستُعرض مع البادئة "<code>‎..7</code>‎".
        |               | For `a', `A', `e', `E', `f', `g', and 'G',
|-
        |               | force a decimal point to be added,
|<code>u</code>
        |               | even if no digits follow.
|مشابه لـ "<code>d</code>"
        |               | For `g' and 'G', do not remove trailing zeros.
|-
---------+---------------+-----------------------------------------
|<code>x</code>
+        | bBdiouxX      | Add a leading plus sign to non-negative
|يحول الوسيط إلى عدد ستة عشري(hexadecimal number).
        | aAeEfgG      | numbers.
الأعداد السالبة ستُعرض مع البادئة "<code>‎..f</code>" (تمثل سلسلة نصية  لامنتهية من حروف <code>f</code>)
        | (numeric fmt) | For `o', `x', `X', `b' and `B', use
|-
        |               | a minus sign with absolute value for
|<code>X</code>
        |               | negative values.
|مكافئ ل <code>x</code> لكن مع استخدام الحروف الكبيرة.
---------+---------------+-----------------------------------------
|-
-        | all          | Left-justify the result of this conversion.
!الحقل
---------+---------------+-----------------------------------------
!التنسيق (Format)
0 (zero) | bBdiouxX      | Pad with zeros, not spaces.
|-
        | aAeEfgG      | For `o', `x', `X', `b' and `B', radix-1
|<code>e</code>
        | (numeric fmt) | is used for negative numbers formatted as
|يحول الوسائط العددية الكسرية (floating point) إلى الشكل الأسي مع رقم واحد قبل النقطة العشرية على الشكل ‎<code>[-]d.dddddde[+-]dd</code>تحدد الدقة (‎precision) عدد الأرقام بعد النقطة العشرية (القيمة الافتراضية تساوي 6).
        |               | complements.
|-
---------+---------------+-----------------------------------------
|<code>E</code>
*        | all          | Use the next argument as the field width.
|يكافئ "<code>e</code>"  لكن يستخدم حرف <code>E</code> كبير للدلالة على الأس.
        |              | If negative, left-justify the result. If the
|-
        |               | asterisk is followed by a number and a dollar
|<code>f</code>
        |               | sign, use the indicated argument as the width.</syntaxhighlight>
|يحول الوسائط العددية الكسرية إلى الشكل الأسي مع رقم واحد قبل النقطة العشرية على الشكل ‎<code>[-]ddd.dddddd</code>، حيث تحدد الدقة عدد الأرقام بعد النقطة العشرية.
أمثلة على الرايات:
|-
|<code>g</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>[-]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>
|الوسيط (Argument) هو الكود الرقمي لحرف واحد أو سلسلة نصية.
|-
|<code>p</code>
|فيمة التعبير <code>argument.inspect</code>.
|-
|<code>s</code>
|الوسيط (Argument) هو سلسلة نصية المراد تعويضها. إن احتوى شكل التنسيق على الدقة (precision)، فسيكون عدد الأحرف المنسوخة أصغر من تلك الدقة.
|-
|<code>%</code>
|ستُعرض علامة النسبة المئوية بنفسها، ولن يؤخذ أي وسيط.
|}تقوم الحقول <code>flags</code> بتعديل سلوك التنسيقات. أحرف الراية <code>flag</code> هي كالتالي:
{| class="wikitable"
!الراية               
!تُطبق على              
!شرح
|-
|مسافة            بيضاء
|bBdiouxX
aAeEfgG


الحقل width هو عدد صحيح اختياري، متبوعًا اختياريًا بنقطة ودقة (precision). يحدد width الحد الأدنى لعدد الأحرف التي ستُكتب في النتيجة الخاصة بهذا الحقل.
(numeric fmt)
أمثلة على width:
|يترك مسافة بيضاء في بداية الأعداد غير السالبة.
بالنسبة لـ `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).


بالنسبة للحقول العددية، تتحكم الدقة (precision) في عدد المنازل العشرية المعروضة. بالنسبة للحقول النصية، تحدد الدقة الحد الأقصى لعدد الأحرف التي ستُنسخ من السلسلة النصية.  (وهكذا ، فإن تسلسل التنسيق <code>%10.10s</code> سيساهم دائمًا بعشرة أحرف بالضبط في النتيجة.)
بالنسبة للتحويلات `x' و `X' و `b' و`B'، بالنسبة للأعداد المخالفة للصفر، تُبدأ النتيجة بـ
أمثلة على الدقة:


أمثلة:
<code>``0x<nowiki>''</nowiki></code>و  <code>``0X<nowiki>''</nowiki></code> و <code>``0b<nowiki>''</nowiki></code>  و<code>``0B<nowiki>''</nowiki></code>, تواليًا.


للتنسيقات الأكثر تعقيدًا، تدعم روبي المراجع الاسمية (reference by name). يستخدم النمط <name> s نمط التنسيق ، على خلاف النمط ٪ {name}.
بالنسبة ل`a'و `A' و `e' و `Eو `f' و `g' و 'G'، تُفرض إضافة النقطة العشرية، حتى لو لم يكن بعدها أي أرقام.
أمثلة:
==البنية العامة==
<syntaxhighlight lang="ruby">sprintf(format_string [, arguments...] )  → string‎</syntaxhighlight>
==المعاملات==
===<code>format_string‎</code>===
 
===<code>arguments...‎</code>===


بالنسبة لـ `g' و  'G' ، لا تزيل الأصفار الإضافية.
|-
|<code>+</code>
|bBdiouxX
aAeEfgG


==القيمة المُعادة==
(numeric fmt)
|تضيف علامة + في بداية الأعداد الموجبة.
بالنسبة لـ `o' و `x' و `X' و `b' و`B'، تُستخدم علامة الإشارة ناقص مع القيمة المطلقة للأعداد السالبة.
|-
|<code>-</code>
|الكل
|تعدل نتيحة التحويل من الجهة اليسرى.
|-
|<code>0</code>
|bBdiouxX
aAeEfgG


==أمثلة==
(numeric fmt)
مثال على استخدام التابع <code>sprintf‎</code>:
|تملأ المنازل الرقمية الفارغة بالأصفار، وليس المسافات البيضاء، بالنسبة لـ `o' و `x' و `X' و `b' و`B'، تُستخدم radix-1  للأعداد السالبة المُنسّقة على شكل مكملات.
<syntaxhighlight lang="ruby"># `+' and space flag specifies the sign of non-negative numbers.
|-
|<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: سطر 149:
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: سطر 158:
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: سطر 171:
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: سطر 189:
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>بالنسبة للتنسيقات الأكثر تعقيدًا، تدعم روبي المراجع الاسمية (reference by name). حيث يستخدم النمط ‎<code><name>s</code> نمط التنسيق (format style)، وذلك على خلاف النمط‎ <code>%{name}‎</code>.
==البنية العامة==
<syntaxhighlight lang="ruby">sprintf(format_string [, arguments...] )  → string‎</syntaxhighlight>
==المعاملات==
===<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>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‎ في توثيق روبي الرسمي.]

مراجعة 17:00، 23 أكتوبر 2018

يعيد التابع sprintf السلسلة النصية الناتجة من تطبيق format_string على الوسائط الإضافية. داخل سلسلة التنسيق، يتم نسخ كل الأحرف في النتيجة باستثناء تسلسلات التنسيق (format sequences).

صياغة تسلسلات التنسيق تأخذ الشكل الآتي.

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

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

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

تعدل الرايات سلوك التنسيقات. أحرف الراية هي:

الحقل التنسيق (Integer)
b يحول الوسيط إلى عدد ثنائي (binary number).

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

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

الأعداد السالبة ستُعرض مع البادئة "‎..7‎".

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

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

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

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

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

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

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

المعاملات

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: ينسق التابع format السلسلة النصية المعطاة..

مصادر