2

我正在编写一个脚本来将 IPTC 数据添加到图像文件夹中。它从 EXIF 信息中提取日期并将其添加到'Caption'IPTC 标签中。

date = iptc["DateTimeOriginal"]
date = date.strftime('%A %e %B %Y').upcase
iptc["Caption"] = '%s: %s (%s)' % [date, caption, location]

除日期输出外,该脚本有效:

Sunday 13 October 2013

理想情况下,我希望它输出:

Sunday 13th October 2013

任何建议将不胜感激。

4

2 回答 2

3

如果您能够(并且愿意)将 Ruby gem 加入其中,请考虑ActiveSupport::Inflector. 你可以安装它

gem install active_support

(你可能需要sudo

然后在您的文件中要求它并包括ActiveSupport::Inflector

require 'active_support/inflector' # loads the gem
include ActiveSupport::Inflector # brings methods to current namespace

那么你可以随意ordinalize整数:

ordinalize(1)  # => "1st"
ordinalize(13) # => "13th"

但是,您可能必须手动将日期字符串化:

date = iptc["DateTimeOriginal"]
date_string = date.strftime('%A ordinalday %B %Y')
date_string.sub!(/ordinalday/, ordinalize(date.day))
date_string.upcase!

你应该在路上:

iptc["Caption"] = "#{date_string}: #{caption} #{location}"
于 2013-10-13T17:48:43.637 回答
3

如果您不想要求 ActiveSupport 的帮助器,也许只需复制一种特定的方法来完成这项工作:

# File activesupport/lib/active_support/inflector/methods.rb
def ordinalize(number)
  if (11..13).include?(number.to_i.abs % 100)
    "#{number}th"
  else
    case number.to_i.abs % 10
      when 1; "#{number}st"
      when 2; "#{number}nd"
      when 3; "#{number}rd"
      else    "#{number}th"
    end
  end
end

使用脚本中的该方法,将代码更改为:

date = date.strftime("%A #{ordinalize(date.day)} %B %Y")
于 2013-10-13T17:49:25.243 回答