原文: https://zetcode.com/lang/rubytutorial/strings/

在 Ruby 教程的这一部分中,我们将更详细地处理字符串数据。

字符串是计算机语言中最重要的数据类型之一。 这就是为什么我们将一整章专门讨论在 Ruby 中使用字符串的原因。

字符串是 Unicode 字符序列。 它是一种存储数据值序列的数据类型,其中元素通常根据字符编码代表字符。 当字符串按字面意义出现在源代码中时,称为字符串字面值。

Ruby 字符串第一个示例

在 Ruby 中,字符串字面值用单引号或双引号引起来。

  1. #!/usr/bin/ruby
  2. # first.rb
  3. puts 'Python language'
  4. puts "Ruby language"

该示例有两个字符串字面值。 第一个用单引号引起来。 另一个用双引号引起来。

  1. $ ./first.rb
  2. Python language
  3. Ruby language

输出。

Ruby 使用引号

如果我们想显示报价,例如直接讲话怎么办? 基本上有两种方法可以做到这一点。

  1. #!/usr/bin/ruby
  2. puts "There are many stars"
  3. puts "He said, \"Which one is your favourite?\""
  4. puts 'There are many stars'
  5. puts 'He said, "Which one is your favourite?"'

我们使用(\)字符转义其他引号。 通常,双引号用于分隔字符串字面值。 但是,当转义时,其原始含义被抑制。 它显示为普通字符,可以在字符串字面值中使用。 在引号中使用引号的第二种方法是混合单引号和双引号。

  1. $ ./quotes.exe
  2. There are many stars.
  3. He said, "Which one is your favourite?"

Output.

Ruby 转义序列

转义序列是在字符串字面值中使用时具有特定含义的特殊字符。

  1. #!/usr/bin/ruby
  2. puts "one two three four"
  3. puts "one\ntwo\nthree\nfour"

最常见的转义序列之一是换行符\n。 它有许多编程语言可用。 换行符后的下一个字符将出现在新行中。

  1. $ ./newline.rb
  2. one two three four
  3. one
  4. two
  5. three
  6. four

在上面脚本的输出中,换行符后的单词出现在换行符上。

rbt字符是普通字母字符。 以\字符开头时,它们具有特殊含义。

  1. #!/usr/bin/ruby
  2. puts " bbb\raaa"
  3. puts "Joan\b\b\bane"
  4. puts "Towering\tinferno"

在上面的示例中,我们使用了三个不同的转义字符。

  1. puts " bbb\raaa"

回车\r是行尾到行首的控制字符。 在将字符串打印到控制台之前,先对其进行处理。 转义序列使aaa字符放置在bbb字符之前。 输出为aaabbb

  1. puts "Joan\b\b\bane"

\b控制字符是一个空格。 删除前一个字符。 打印到控制台的字符串是"Jane"而不是"Joan"

  1. puts "Towering\tinferno"

最后,\t转义序列在两个单词之间放置一个制表符空间。

  1. $ ./escapes.rb
  2. aaabbb
  3. Jane
  4. Towering inferno

示例的输出。

反斜杠字符\是用于创建转义序列的特殊字符。 当需要打印反斜杠本身时,它前面会带有另一个反斜杠。 其默认含义被转义并被打印。 单引号和双引号用于在 Ruby 中定界字符串。 为了打印它们,它们之前还带有\

  1. #!/usr/bin/ruby
  2. puts "The special character \\"
  3. puts "The special character \'"
  4. puts "The special character \""

在这个简单的脚本中,我们将所有三个字符打印到终端。

  1. $ ./specials.rb
  2. The special character \
  3. The special character '
  4. The special character "

Output.

Ruby 访问字符串元素

可以在 Ruby 中访问字符串元素。 为此,我们使用方括号[]。 在方括号内,我们可以放置字符串,索引或范围。

  1. #!/usr/bin/ruby
  2. msg = "Ruby language"
  3. puts msg["Ruby"]
  4. puts msg["Python"]
  5. puts msg[0]
  6. puts msg[-1]
  7. puts msg[0, 3]
  8. puts msg[0..9]
  9. puts msg[0, msg.length]

此代码示例说明如何访问字符串的一部分。

  1. msg = "Ruby language"

这是我们将要访问的字符串。

  1. puts msg["Ruby"]

在此代码行中,我们测试字符串'Ruby'是否为msg字符串的子字符串。 如果为true,则返回我们要查找的字符串。

  1. puts msg[0]

字符串的字符可以通过其索引进行访问。 数字从 0 开始。换句话说,0 是第一个字符的索引。 msg[0]返回字符串的第一个字符,即R

  1. puts msg[-1]

在这里,我们访问字符串的最后一个字符。 -1 代表字符串的最后一个索引。

  1. puts msg[0, 3]

用逗号分隔的两个索引返回从第一个索引开始到第二个索引结束的字符(不包括在内)。

  1. puts msg[0..9]

也可以使用范围运算符。 在这里,我们打印msg字符串的前十个字符。

  1. puts msg[0, msg.length]

该行返回整个字符串。 msg.length返回字符串的大小。

  1. $ ./access.rb
  2. Ruby
  3. R
  4. e
  5. Rub
  6. Ruby langu
  7. Ruby language

Output of the example.

Ruby 多行字符串

在许多编程语言中,创建多行字符串需要付出额外的努力。 在 Visual Basic 中尤其如此。 在 Ruby 中,可以轻松创建多行字符串。

  1. #!/usr/bin/ruby
  2. puts "I hear Mariachi static on my radio
  3. And the tubes they glow in the dark
  4. And I'm there with her in Ensenada
  5. And I'm here in Echo Park
  6. "
  7. puts %/
  8. Carmelita hold me tighter
  9. I think I'm sinking down
  10. And I'm all strung out on heroin
  11. On the outskirts of town/
  12. puts <<STRING
  13. Well, I'm sittin' here playing solitaire
  14. With my pearl-handled deck
  15. The county won't give me no more methadone
  16. And they cut off your welfare check
  17. STRING

在示例中,我们有 Carmelita 歌曲的歌词。 我们展示了三种打印多行字符串的方法。 可以在双引号中使用它们。 我们可以使用% 字符来构建多行字符串。 %后面的字符也将字符串括起来。 最后,我们可以使用 heredoc 语法。 在此语法中,我们使用<<,后跟一些字符串。 该字符串包含多行字符串。 它还必须保持对齐。

Ruby 变量插值

变量插值是用字符串字面值中的值替换变量。 要用值替换变量,将变量名放在字符串字面值内的#{}字符之间。

  1. #!/usr/bin/ruby
  2. name = "Jane"
  3. age = 17
  4. puts "#{name} is #{age} years old"

在此示例中,我们替换字符串中的两个变量:nameage

  1. $ ./interpolation.rb
  2. Jane is 17 years old

在替换中,可以使用表达式。

  1. #!/usr/bin/ruby
  2. x = 5
  3. y = 6
  4. puts "The product of #{x} and #{y} is #{x*y}"

这是替换表达式的一个示例。

  1. $ ./interpolation2.rb
  2. The product of 5 and 6 is 30

运行示例。

还有另一种替代变量的方法。 它类似于 Python 2.x 支持插值的方式。

  1. #!/usr/bin/ruby
  2. name = "Jane"
  3. age = 17
  4. message = "%s is %d years old" % [name, age]
  5. puts message

例。

  1. message = "%s is %d years old" % [name, age]

我们在使用它之前先构建一个字符串。 %s%d分别是期望包含字符串和数字的格式化字符。 这些值在%字符后的方括号中提供。

Ruby 连接字符串

连接字符串是从多个字符串中创建一个字符串。

  1. #!/usr/bin/ruby
  2. lang = "Ruby" + " programming" + " languge"
  3. puts lang
  4. lang = "Python" " programming" " language"
  5. puts lang
  6. lang = "Perl" << " programming" << " language"
  7. puts lang
  8. lang = "Java".concat(" programming").concat(" language")
  9. puts lang

Ruby 提供了多种连接字符串的方法。

  1. lang = "Ruby" + " programming" + " languge"

加号运算符是最常用的运算符,用于添加计算机语言中的字符串。 Perl 和 PHP 使用点.运算符来连接字符串。

  1. lang = "Python" " programming" " language"

Ruby 自动连接后续的字符串。

  1. lang = "Perl" << " programming" << " language"

可以用来连接字符串的另一个运算符是<<

  1. lang = "Java".concat(" programming").concat(" language")

实际上,每个字符串字面值都是一个对象。 我们可以在每个 Ruby 对象上调用各种方法。 在字符串对象上,我们可以调用concat方法,该方法将添加两个字符串对象。 它还返回最终对象,我们可以在该对象上调用另一个方法。 因此,我们可以将这些方法放在一个链中。

  1. $ ./concatenate.rb
  2. Ruby programming languge
  3. Python programming language
  4. Perl programming language
  5. Java programming language

Output.

Ruby 冻结字符串

在 Java 或 C# 中,字符串是不可变的。 这意味着我们无法修改现有字符串。 我们只能从现有的字符串中创建一个新字符串。 在 Ruby 中,默认情况下字符串不是不可变的。

Ruby 中的字符串对象具有freeze方法,这使它们不可变。

  1. #!/usr/bin/ruby
  2. msg = "Jane"
  3. msg << " is "
  4. msg << "17 years old"
  5. puts msg
  6. msg.freeze
  7. #msg << "and she is pretty"

在此示例中,我们演示了可以修改字符串。 但是,在对字符串对象调用freeze方法之后,我们将无法再修改字符串。 如果我们取消注释代码行,则会收到“无法修改冻结的字符串”错误消息。

Ruby 比较字符串

比较字符串是编程中的常见工作。 我们可以使用==运算符或eql?方法比较两个字符串。 如果字符串相等,则返回true;否则返回false

  1. #!/usr/bin/ruby
  2. puts "12" == "12"
  3. puts "17" == "9"
  4. puts "aa" == "ab"
  5. puts "Jane".eql? "Jan"
  6. puts "Jane".eql? "Jane"

在此代码示例中,我们比较了一些字符串。

  1. puts "12" == "12"

这两个字符串相等,该行返回true

  1. puts "aa" == "ab"

两个字符串的前两个字符相等。 接下来比较以下字符。 它们是不同的,因此该行返回false

  1. puts "Jane".eql? "Jan"

eql?方法用于比较两个字符串。 字符串是对象,并且都具有内置的eql?方法。 该方法采用一个参数,即我们要与之比较的第一个字符串的字符串。

  1. $ ./comparing.rb
  2. true
  3. false
  4. false
  5. false
  6. true

程序的输出。

Ruby 具有飞船运算符<==>。 该运算符来自 Perl 语言。 与上面两种比较字符串(返回truefalse)的方式不同,此运算符将返回 1、0 或 -1。 取决于左参数相对于右参数的值。 如果左参数大于右参数,则运算符返回 1。如果左参数小于右参数,则运算符返回 -1。 如果两个参数相等,则运算符将返回 0。这意味着一个字符大于另一个字符? 字符在表中排序。 每个字符在表中都有一个位置。 比较字符时,我们将比较它们在此类表格中的位置。 例如,在 ASCII 表中,字符a位于字符b之前。 因此比较<==> b会返回 -1,因为左侧参数的位置比b低。

  1. #!/usr/bin/ruby
  2. puts "a" <==> "b"
  3. puts "b" <==> "a"
  4. puts "a" <==> "a"

将角色与太空飞船运算符进行比较。

  1. $ ./spaceship.rb
  2. -1
  3. 1
  4. 0

Output of the example.

不管大小写,都可以比较字符串。 为此,Ruby 具有casecmp方法。 该方法的工作方式与飞船运算符相同。

  1. #!/usr/bin/ruby
  2. puts "Jane".casecmp "Jane"
  3. puts "Jane".casecmp "jane"
  4. puts "Jane".casecmp "Jan"

Example.

  1. puts "Jane".casecmp "Jane"
  2. puts "Jane".casecmp "jane"

这两行返回相同的结果,即 0。在这种情况下,我们不考虑字符是大写还是小写。

  1. $ ./case.rb
  2. 0
  3. 0
  4. 1

Output of the example.

字符串是 Ruby 中的对象

Ruby 是一种面向对象的语言。 对象是 OOP 程序的基本构建块。 字符串也是对象。 对象是数据和方法的组合。 在 OOP 程序中,对象被创建并且它们之间相互通信。

  1. #!/usr/bin/ruby
  2. website = "google.com"
  3. puts website
  4. website = String.new "zetcode.com"
  5. puts website

在上面的示例中,我们展示了在 Ruby 中创建字符串的两种基本方法。

  1. website = "google.com"

这里,字符串字面值被分配给网站变量。 在后台,Ruby 解释器创建一个字符串对象。

  1. website = String.new "zetcode.com"

这是创建字符串对象的标准方法。 但是,在大多数情况下都使用第一种方法,因为它不太冗长,并且是大多数计算机语言中创建字符串的常用方法。

  1. #!/usr/bin/ruby
  2. puts "zetcode".upcase
  3. puts "zetcode".size
  4. puts "zetcode".reverse

在此代码示例中,我们在字符串字面值上调用三个方法。 对于熟悉 Java,C 和类似语言的人,这可能会令人困惑。 在 Ruby 中,字符串字面值被转换为可以在其上调用方法的字符串对象。

  1. $ ./stringobject2.rb
  2. ZETCODE
  3. 7
  4. edoctez

Output of the example.

Ruby 字符串方法

Ruby 字符串对象具有可用于处理字符串的有用方法。 我们已经看到了几种字符串方法,例如concateql?

  1. #!/usr/bin/ruby
  2. word = "Determination"
  3. puts "The word #{word} has #{word.size} characters"
  4. puts word.include? "tion"
  5. puts word.include? "tic"
  6. puts
  7. puts word.empty?
  8. word.clear
  9. puts word.empty?

我们有一个字符串变量。 提出了四种字符串方法。

  1. puts "The word #{word} has #{word.size} characters"

size方法返回字符串中的字符数。

  1. puts word.include? "tion"

include?方法确定在测试的字符串中是否存在子字符串。 在这种情况下,代码行返回true

  1. puts word.empty?
  2. word.clear

empty?方法检查字符串是否为空。 它返回布尔值truefalseclear方法使字符串为空。

  1. $ ./basicmethods.rb
  2. The word Determination has 13 characters
  3. true
  4. false
  5. false
  6. true

输出。

在下一个示例中,我们将提供适用于字符大小写的方法。

  1. #!/usr/bin/ruby
  2. ruby = "Ruby programming language"
  3. puts ruby.upcase
  4. puts ruby.downcase
  5. puts ruby.capitalize
  6. puts ruby.swapcase

Ruby 有四种字符大小写方法。 upcase方法返回字符串的副本,其中所有字符均大写。 downcase方法返回字符串的副本,其中所有字符均为小写。 capitalize方法返回字符串的副本,其中第一个字符转换为大写,其余字符转换为小写。 最后,swapcase方法返回字符串的副本,其中大写字母转换为小写,反之亦然。

  1. $ ./rubylang.rb
  2. RUBY PROGRAMMING LANGUAGE
  3. ruby programming language
  4. Ruby programming language
  5. rUBY PROGRAMMING LANGUAGE

Output.

接下来,我们介绍两种 Ruby 字符串方法:start_with?end_with?。 这两个方法均返回布尔值truefalse。 它们分别确定字符串以特定字符串开头还是结尾。

  1. #!/usr/bin/ruby
  2. ws1 = "zetcode.com"
  3. ws2 = "www.gnome.org"
  4. puts ws1.start_with? "www."
  5. puts ws2.start_with? "www."
  6. puts
  7. puts ws1.end_with? ".com"
  8. puts ws2.end_with? ".com"

这是上述方法的示例。

  1. puts ws1.start_with? "www."

在这里,我们检查字符串是否以"www"开头。 否,因此控制台的输出为布尔值false

  1. puts ws1.end_with? ".com"

我们检查ws1字符串变量是否以".com"后缀结尾。 确实如此,因此我们在控制台中看到了一个真实的结果。

  1. $ ./startend.rb
  2. false
  3. true
  4. true
  5. false

Output.

在下面的示例中,我们将处理inspect方法。 该方法返回一个原始字符串,该字符串用引号引起来,带有未解释的特殊字符。 当我们要检查什么字符组成字符串时,这很有用。

  1. #!/usr/bin/ruby
  2. msg = "Jane\t17\nThomas\t23"
  3. puts msg
  4. puts msg.inspect

inspect字符串方法的示例。

  1. msg = "Jane\t17\nThomas\t23"

这是一个带有一些特殊字符的字符串。

  1. puts msg
  2. puts msg.inspect

在第一种情况下,特殊字符被解释。 字符串部分之间有一个制表符和换行符。 在第二种情况下,我们以原始格式获取字符串。

  1. $ ./inspectmethod.rb
  2. Jane 17
  3. Thomas 23
  4. "Jane\t17\nThomas\t23"

Output of the example.

chomp方法返回一个新字符串,其中记录分隔符已从字符串末尾删除。 默认的分隔符是换行符(\n)。

  1. #!/usr/bin/ruby
  2. print "Are you sure to download? (Yes/No) "
  3. response = gets
  4. if (response.downcase == "yes")
  5. puts "Downloaded"
  6. else
  7. puts "Download cancelled"
  8. end
  9. puts response.inspect

在上面的脚本中,我们从用户那里得到了输入。 我们对用户的反应作出反应。

  1. $ ./chomp.rb
  2. Are you sure to download? (Yes/No) Yes
  3. Download cancelled
  4. "Yes\n"

该脚本无法正常运行。 当我们考虑inspect返回时,原因就很清楚了。 来自用户的输入以回车键结束。 换行符也包含在响应变量中。 并且"yes"不等于"yes\n"。 要更正脚本,我们使用chomp方法。 它从变量中删除换行符。

  1. #!/usr/bin/ruby
  2. print "Are you sure to download? (Yes/No) "
  3. response = gets
  4. if (response.downcase.chomp == "yes")
  5. puts "Downloaded"
  6. else
  7. puts "Download cancelled"
  8. end
  9. puts response.inspect

这是更正的示例。

  1. if (response.downcase.chomp == "yes")

在这里,我们在将输入与"yes"字符串进行比较之前先对其进行处理。 chomp方法删除换行符。

  1. $ ./chomp.rb
  2. Are you sure to download? (Yes/No) Yes
  3. Downloaded
  4. "Yes\n"

现在该示例正常工作。

Ruby 格式化字符串

Ruby 具有格式说明符。 格式说明符确定字符串的外观。 它以%字符开头。 格式说明符放在单引号或双引号中。

格式说明符具有以下字段:

  1. %[flags][field width][precision]conversion specifier

方括号中的字段是可选的。

转换说明符指定如何将数据转换为可显示形式。

  1. #!/usr/bin/ruby
  2. puts "There are %d oranges in the basket." % 12
  3. puts "There are %d oranges and %d apples in the basket." % [12, 10]

这是一些格式说明符的示例。

  1. puts "There are %d oranges in the basket" % 12

当我们在字符串中使用%d表示法时,我们期望此时有一个数字。 d是十进制数字的转换说明符。 该数字在%字符后给出。

  1. puts "There are %d oranges and %d apples in the basket" % [12, 10]

我们可以在字符串中使用多个格式说明符。 每个字母都以% 字符开头。 多个值位于[]字符之间,并用逗号分隔。

  1. $ ./formatspecifiers.rb
  2. There are 12 oranges in the basket.
  3. There are 12 oranges and 10 apples in the basket.

Output of the example.

在下面的示例中,我们将介绍一些基本的转换说明符。

  1. #!/usr/bin/ruby
  2. puts "There are %d apples." % 5
  3. puts "I can see %i oranges." % 3
  4. puts "The width of iPhone 3G is %f mm." % 62.1
  5. puts "This animal is called a %s" % "rhinoceros."

我们有整数,浮点数和字符串的转换说明符。

  1. puts "There are %d apples." % 5
  2. puts "I can see %i oranges." % 3

di均可用于整数。

  1. puts "The width of iPhone 3G is %f mm." % 62.1

f是浮点值的转换说明符。 默认情况下,浮点数有六个小数位。

  1. puts "This animal is called a %s" % "rhinoceros."

s字符用于字符串。

  1. $ ./basicspecifiers.rb
  2. There are 5 apples.
  3. I can see 3 oranges.
  4. The width of iPhone 3G is 62.100000 mm.
  5. This animal is called a rhinoceros.

Output of the example.

接下来,我们有一个使用格式说明符的实际示例。

  1. #!/usr/bin/ruby
  2. website = "zetcode.com"
  3. website.each_char do |c|
  4. print "#{c} has ASCII code %d\n" % c.ord
  5. end

在此示例中,我们遍历字符串的所有字符并将其 ASCII 值打印到终端。

  1. website.each_char do |c|
  2. print "#{c} has ASCII code %d\n" % c.ord
  3. end

each_char方法将网站字符串的每个字符传递到块,每个周期一个字符,而当前字符存储在c变量中。 我们使用ord方法获得字符的 ASCII 码,该方法返回一个字符串的序数。

  1. $ ./character.rb
  2. z has ASCII code 122
  3. e has ASCII code 101
  4. t has ASCII code 116
  5. c has ASCII code 99
  6. o has ASCII code 111
  7. d has ASCII code 100
  8. e has ASCII code 101
  9. . has ASCII code 46
  10. c has ASCII code 99
  11. o has ASCII code 111
  12. m has ASCII code 109

示例的输出。

数字可以以多种形式显示。 转换说明符可用于格式化数字。

  1. #!/usr/bin/ruby
  2. # decimal
  3. puts "%d" % 300
  4. # hexadecimal
  5. puts "%x" % 300
  6. # octal
  7. puts "%o" % 300
  8. # binary
  9. puts "%b" % 300
  10. # scientific
  11. puts "%e" % (5/3.0)

在上面的示例中,我们以十进制,十六进制,八进制,二进制和科学格式打印数字。

  1. # hexadecimal
  2. puts "%x" % 300

x转换说明符用于将数字转换为十六进制格式。

  1. # binary
  2. puts "%b" % 300

x转换说明符用于将数字转换为二进制格式。

  1. $ ./various.rb
  2. 300
  3. 12c
  4. 454
  5. 100101100
  6. 1.666667e+00

Output.

精度是格式说明符中的一个字段。 指定为小数点后的数字。 对于整数,浮点数和字符串,它具有不同的含义。 与整数一起使用时,它指示要打印的最小位数。 如果数字的位数少于精度,则以零作为前缀。 整数的默认精度为 1,表示不填充零。 与浮点数一起使用时,精度是小数点后显示的位数。 最后,对于字符串,精度是打印的最大字符数。

  1. #!/usr/bin/ruby
  2. puts 'Height: %f %s' % [172.3, 'cm']
  3. puts 'Height: %.1f %s' % [172.3, 'cm']
  4. puts "%d" % 16
  5. puts "%.5d" % 16
  6. puts "%s" % "zetcode"
  7. puts "%.5s" % "zetcode"

在此示例中,我们将使用precision字段。

  1. puts 'Height: %f %s' % [172.3, 'cm']
  2. puts 'Height: %.1f %s' % [172.3, 'cm']

172.3 是浮点数。 如果未指定精度,则小数点后将有 6 个小数位。 在我们的情况下,将有 5 个零。 第二条代码行中的.1是精度。 对于浮点值,它将小数位数减少到 1。

  1. puts "%d" % 16
  2. puts "%.5d" % 16

整数的默认精度为 1。在第二行中,我们指定了精度.5,该精度将 3 个零添加(添加)到 16 个数字中。

  1. puts "%s" % "zetcode"
  2. puts "%.5s" % "zetcode"

第一行显示字符串的所有字符。 第二行仅打印其中五个。 删除两个字符。

  1. $ ./precision.rb
  2. Height: 172.300000 cm
  3. Height: 172.3 cm
  4. 16
  5. 00016
  6. zetcode
  7. zetco

Output.

字段宽度指定要显示的数据的最小宽度。 它是一个数字,如果存在,则在小数点之前。 如果输出较短,则用空格填充,并使其右对齐。 如果我们在字段宽度之前放置减号,则它将保持对齐。 如果输出长于字段宽度,则会完整显示。

  1. #!/usr/bin/ruby
  2. puts "%d" % 1
  3. puts "%d" % 16
  4. puts "%d" % 165
  5. puts "%d" % 1656
  6. puts "%d" % 16567
  7. puts "%10d" % 1
  8. puts "%10d" % 16
  9. puts "%10d" % 165
  10. puts "%10d" % 1656
  11. puts "%10d" % 16567

在第一种情况下,我们打印五个数字而不指定字段宽度。 输出的宽度等于要显示的字符数。 在第二种情况下,字段宽度为 10。5 个输出中的每个输出的最小长度为 10 个字符。 数字右对齐。

  1. puts "%d" % 1
  2. puts "%d" % 16

我们打印两个数字。 输出的宽度分别为 1、2 个字符。

  1. puts "%10d" % 1
  2. puts "%10d" % 16

两种情况下的长度均为 10 个字符。 这两个数字以给定的顺序填充 9 和 8 空格。

  1. $ ./fieldwidth.rb
  2. 1
  3. 16
  4. 165
  5. 1656
  6. 16567
  7. 1
  8. 16
  9. 165
  10. 1656
  11. 16567

我们可以看到,在第二种情况下,数字是右对齐的。

标志限定符修改格式的行为。

#标志分别将0b00x前缀添加到二进制,八进制和十六进制格式。 即使精度限制了小数位数,它也会向浮点值添加小数点。

  1. #!/usr/bin/ruby
  2. puts "%#b" % 231
  3. puts "%#x" % 231
  4. puts "%#o" % 231
  5. puts "%.0e" % 231
  6. puts "%#.0e" % 231
  7. puts "%.0f" % 231
  8. puts "%#.0f" % 231

在代码示例中,我们使用x标志。

  1. puts "%#b" % 231
  2. puts "%#x" % 231
  3. puts "%#o" % 231

十进制 231 以二进制,八进制和十六进制格式打印。 #标志为它们添加前缀。

  1. puts "%.0e" % 231
  2. puts "%#.0e" % 231

在此,.0精度替代数字的小数位。 但是,当与#标志一起使用时,即使没有十进制数字,也会显示小数点。

  1. $ ./flags1.rb
  2. 0xe7
  3. 0b11100111
  4. 0347
  5. 2e+02
  6. 2.e+02
  7. 231
  8. 231.

Output.

+标志为正的十进制数字添加一个加号。 对于二进制,八进制和十六进制的负数,它将添加一个负号并使用一个绝对值。

  1. #!/usr/bin/ruby
  2. puts "%d" % 231
  3. puts "%+d" % 231
  4. puts "%d" % -231
  5. puts "%+d" % -231
  6. puts "%b" % -231
  7. puts "%o" % -231
  8. puts "%x" % -231
  9. puts "%+b" % -231
  10. puts "%+o" % -231
  11. puts "%+x" % -231

演示格式说明符的+标志的示例。

  1. puts "%d" % 231
  2. puts "%+d" % 231

通常,正数会省略其符号。 如果要显示正数的加号,请指定+标志。

  1. puts "%d" % -231
  2. puts "%+d" % -231

+标志对负数无效。 输出是相同的。

  1. puts "%b" % -231
  2. puts "%o" % -231
  3. puts "%x" % -231

二进制,八进制和十六进制数具有创建负数的自己的方式。

  1. puts "%+b" % -231
  2. puts "%+o" % -231
  3. puts "%+x" % -231

如果我们为这些负数指定+标志,则会将数字转换为其他格式并添加减号。 没有表示负数的特殊方法。

  1. $ ./flags2.rb
  2. 231
  3. +231
  4. -231
  5. -231
  6. ..100011001
  7. ..7431
  8. ..f19
  9. -11100111
  10. -347
  11. -e7

Output of the example.

在这里,我们介绍0标志和-标志。 0标志使数字以零而不是空格填充。 -标志使输出左对齐。

  1. #!/usr/bin/ruby
  2. puts "%010d" % 1
  3. puts "%010d" % 16
  4. puts "%010d" % 165
  5. puts "%010d" % 1656
  6. puts "%010d" % 16567
  7. puts "%-10d" % 1
  8. puts "%-10d" % 16
  9. puts "%-10d" % 165
  10. puts "%-10d" % 1656
  11. puts "%-10d" % 16567

例。

  1. puts "%010d" % 1
  2. puts "%010d" % 16

数字将用零填充。

  1. puts "%-10d" % 1
  2. puts "%-10d" % 16

小于字段宽度的数字被对齐。 并且-标志使其左对齐。

  1. $ ./fieldwidth2.rb
  2. 0000000001
  3. 0000000016
  4. 0000000165
  5. 0000001656
  6. 0000016567
  7. 1
  8. 16
  9. 165
  10. 1656
  11. 16567

示例的输出。

*标志可用于精度和宽度。 每当我们使用*标志时,我们都必须指定精度或宽度作为参数。

  1. #!/usr/bin/ruby
  2. puts "%.*f" % [3, 1.1111111]
  3. puts "%0*d" % [10, 2]
  4. puts "%0*.*f" % [10, 3, 1.1111]

*标志的示例。

  1. puts "%.*f" % [3, 1.1111111]

在这里,我们将*标志用于精度。 第一个数字 3 是精度的参数。 它说 1.1111111 浮点数将只显示三个小数位。

  1. puts "%0*d" % [10, 2]

在此代码行中,我们使用*标志作为宽度。 我们必须在[]括号之间添加宽度。 第一个数字是宽度,第二个数字是转换说明符的值。

  1. puts "%0*.*f" % [10, 3, 1.1111]

*标志可用于宽度和精度。 我们必须在[]括号中都指定它们。

  1. $ ./flags3.rb
  2. 1.111
  3. 0000000002
  4. 000001.111

Output of the example.

Ruby 教程的这一部分介绍了字符串。