Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将整数(月份)转换为人性化字符串?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何将整数(月份)转换为人性化字符串?

Ruby on rails 如何将整数(月份)转换为人性化字符串?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我需要将基于整数的月数转换为一个人性化的字符串,其中包含关于年的信息。这不容易解释,所以我只提供一些例子。我想要的输入和输出是: input: 19 output: "1 year, 7 months" input: 24 output: "2 years" input: 26 output: "2 years, 2 months" 你知道任何现成的解决方案吗?如果没有,您自己将如何实施 input = 26 year, mont

我需要将基于整数的月数转换为一个人性化的字符串,其中包含关于年的信息。这不容易解释,所以我只提供一些例子。我想要的输入和输出是:

input: 19
output: "1 year, 7 months"

input: 24
output: "2 years"

input: 26
output: "2 years, 2 months"
你知道任何现成的解决方案吗?如果没有,您自己将如何实施

input = 26
year, month = input.divmod(12)
if month.eql? 0 and year > 1
  puts "#{year} years"
elsif month.eql? 0 and year.eql? 1
  puts "#{year} year"
elsif year > 1
  puts "#{year} years, #{month} month"
else
  puts "#{year} year, #{month} month"
end
输出

2 years, 2 month
输出

2 years, 2 month
def复数化(num,string)
[num,(num==1?字符串:“{string}s”)]*'
终止
def人性化月数(月)
月份=输入%12
年份=投入/12
text=[]
文本0
文本0
文本*','
终止
def复数(num,string)
[num,(num==1?字符串:“{string}s”)]*'
终止
def人性化月数(月)
月份=输入%12
年份=投入/12
text=[]
文本0
文本0
文本*','
终止
只是为了好玩:

num.divmod(12).then { |y, m| [y, m].zip ['years', 'months'] }
              .reject{ |e| e.first.zero? }
              .each{ |e| e.last.delete_suffix!('s') if e.first == 1 }
              .join(' ')
              .tap{ |res| res.replace('0 months') if res.empty? }
样本:

[11, 12, 13, 23, 24, 25, 26].each { |n| p [n, n.divmod(12).then.......] } # pseudo

[11, "11 months"]
[12, "1 year"]
[13, "1 year 1 month"]
[23, "1 year 11 months"]
[24, "2 years"]
[25, "2 years 1 month"]
[26, "2 years 2 months"]
只是为了好玩:

num.divmod(12).then { |y, m| [y, m].zip ['years', 'months'] }
              .reject{ |e| e.first.zero? }
              .each{ |e| e.last.delete_suffix!('s') if e.first == 1 }
              .join(' ')
              .tap{ |res| res.replace('0 months') if res.empty? }
样本:

[11, 12, 13, 23, 24, 25, 26].each { |n| p [n, n.divmod(12).then.......] } # pseudo

[11, "11 months"]
[12, "1 year"]
[13, "1 year 1 month"]
[23, "1 year 11 months"]
[24, "2 years"]
[25, "2 years 1 month"]
[26, "2 years 2 months"]

因为这个问题是用Ruby on Rails标记的,所以可以使用ActiveSupport扩展,所以这也可以:

月数=19#例如
ActiveSupport::Duration.build(月数)。inspect.gsub('和','和')
编辑
我刚刚注意到ActiveSupport::Duration版本6.0.2.2中有一个bug,在版本6.1.0.alpha之前的某个时候修复了该bug,该bug导致了
number\u of_months

的某些值的舍入错误,因为这个问题用Ruby on Rails标记,所以ActiveSupport扩展可用,所以它也可以工作:

月数=19#例如
ActiveSupport::Duration.build(月数)。inspect.gsub('和','和')
编辑
我刚刚注意到ActiveSupport::Duration版本6.0.2.2中有一个bug,在版本6.1.0.alpha之前的某个时候修复了该bug,该bug导致了
number\u of_months

的某些值的舍入错误,不确定您的代码或输出是否不正确,但是否应该是“2年2个月”?我没有投票重开的选择。而且OP甚至没有考虑接受答案,所以问题一定已经结束了。不确定您的代码或输出是否错误,但是否应该是“2年2个月”?我没有投票重新开始的选项。而且OP甚至没有考虑接受答案,所以这个问题一定已经结束了。