iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

Ruby and Rails 的二三事系列 第 19

Ruby and Rails 的二三事 - Day19 "%"和 "sprintf" in Ruby?

  • 分享至 

  • xImage
  •  

僅記錄在找 format string in Ruby 時,對 % 和sprintf
產生的疑問和查詢的過程。

首先,從Ruby 的官方文件開始:

%

Format - Uses str as a format specification, and returns the result of applying it to arg. If the format specification contains more than one substitution, then arg must be an Array or Hash containing the values to be substituted. See Kernel::sprintf for details of the format string.


老樣子,英文字太多,就分段一個一個來:

  1. Uses str as a format specification, and returns the result of applying it to arg.
  2. If the format specification contains more than one substitution, then arg must be an Array or Hash containing the values to be substituted.
  3. See Kernel::sprintf for details of the format string.
"%05d" % 123                              #=> "00123"
"%-5s: %016x" % [ "ID", self.object_id ]  #=> "ID   : 00002b054ec93168"
"foo = %{foo}" % { :foo => 'bar' }        #=> "foo = bar"

str % arg   #=> result

“format specification” % arg( as target )   #=> result( what you expect to )

格式規範 % arg                             #=>   結果

所以,%是用來格式化文字的,會依據妳所使用的 format specification (格式規範)。
很好,新的問題來了:什麼是 format specification?有哪些 type?


要回答上面的問題之前,得先在進步查一下Kernel::sprintf在API裡寫了什麼:

sprintf(*args) public

Returns the string resulting from applying format_string to any additional arguments. Within the format string, any characters other than format sequences are copied to the result.
The syntax of a format sequence is follows.

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

A format sequence consists of a percent sign, followed by optional flags, width, and precision indicators, then terminated with a field type character. The field type controls how the corresponding sprintf argument is to be interpreted, while the flags modify that interpretation.

姆姆,果然是這樣,和我想的一樣呢!說人話啊渾球!!
為了方便理解和查詢,姑且稍微整理一下吧!

  • 常見的類型
Field type Integer Format 請給我中文
b (or B) binary number 2進位數字
d (or i or u) decimal number 10進位數字
o octal number 8進位數字
x (or X) hexadecimal number 16進位數字
Field type Float Format 請給我中文
e(or E) exponential notation 科學計算表示
f float 浮點數
Field type Other Format 請給我中文
s string 字串
  • flag 的範例:
#沒有設定flag
"%d" % 123  #=> "123"
#設定+作為flag
"%+d" % 123 #=> "+123"
#設定 作為flag
"% d" % 123 #=> " 123"

"%.0f" % 1234 #=> "1234"
#設定#作為flag,用來強制產生小數點
"%#.0f" % 1234 #=> "1234."
  • width 的範例:
"%+20d" % 123  #=> "                +123"
"%-20d" % 123  #=> "123                 "

大概就是這樣...
其實,直接看官方文件比較快的說...

啊哈哈哈,剛剛發現自己昨天鐵人賽的文章還放在草稿沒發出去時,
真想掐死昨天的自己啊...囧

嘛,雖然沒辦法連續30天發文,但還是要逼自己繼續下去。
鐵人賽,我會繼續撐下去的!!

參考資料:

sprintf
Kernel


上一篇
Ruby on Rails 的二三事 - Day18 鐵道裡的春天
系列文
Ruby and Rails 的二三事19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
appletabby
iT邦新手 5 級 ‧ 2019-10-03 23:32:39

驚!
可惜哦可惜怎麼會是這樣的結局......

我要留言

立即登入留言