Ruby 之交租阶段信息生成

题目

我看了一下,这个题目应该不是什么机密,所以先放上来了。大概意思是根据合同信息生成交租阶段信息。

解答

要求是要使用 Ruby 生成交租阶段信息,由于时间比较仓促,变量名那些就用得随意了些。要点主要有下面这些:

  • 第一个交费阶段是要单独算
  • 整月和非整月的计算方式是不一样的(同样的整月,不同月的天数不一样,但是租金还是要算成一样的,我目前是把合同起始结束月都当做非整月来算)
  • 循环结束时间判断(其实也就是缴费阶段结束日期和合同的结束日期进行对比判断)
ruby 复制代码
require 'time'
require 'terminal-table'

class Rent
  def initialize(contract_start, contract_end, month_rent, cycle)
    @contract_start = Time.strptime(contract_start, "%Y-%m-%d").to_date
    @contract_end = Time.strptime(contract_end, "%Y-%m-%d").to_date
    @month_rent = month_rent
    @cycle = cycle

    @year_total_rent = 12 * month_rent.to_f
    @tb = Terminal::Table.new
  end

  def generate_next_month_last_day(time)
    date = Date.new(time.year, time.month, time.day)
    date = date.next_month
    Date.civil(date.year, date.month, -1)
  end

  def calculate_first_month_rent(time)
    month_last_day = Date.civil(time.year, time.month, -1)
    month_day_left = month_last_day.day - time.day + 1
    @year_total_rent * month_day_left / 365
  end

  def calculate_last_month_rent(time)
    @year_total_rent * time.day / 365
  end

  def add_rows
    # 合同起始和结束日期当月都按非整月计算,其他整月按整月的租金计算
    rent_day = @contract_start
    total = calculate_first_month_rent(@contract_start)

    to_end = false
    tmp_cycle = @cycle - 1
    next_month_last_day = rent_day
    if tmp_cycle == 0 # 一月一租
      next_month_last_day = Date.civil(next_month_last_day.year, next_month_last_day.month, -1)
    end
    until tmp_cycle == 0
      next_month_last_day = generate_next_month_last_day(next_month_last_day)
      if next_month_last_day > @contract_end
        total += calculate_last_month_rent(@contract_end)
        next_month_last_day = @contract_end
        to_end = true
        break
      end
      total += @month_rent
      tmp_cycle -= 1
    end

    start_date = rent_day
    end_date = next_month_last_day
    @tb.add_row([start_date, end_date, rent_day, "%.2f" % total])
    total = 0

    until to_end
      tmp_cycle = @cycle
      rent_day = Date.new(next_month_last_day.year, next_month_last_day.month, 15)
      start_date = next_month_last_day + 1
      until tmp_cycle == 0
        next_month_last_day = generate_next_month_last_day(next_month_last_day)
        if next_month_last_day > @contract_end
          total += calculate_last_month_rent(@contract_end)
          next_month_last_day = @contract_end
          to_end = true
          break
        end
        total += @month_rent
        tmp_cycle -= 1
      end
      end_date = next_month_last_day
      @tb.add_row([start_date, end_date, rent_day, "%.2f" % total])
      total = 0
    end
  end

  def show_table
    set_table_title
    set_table_headings
    add_rows
    print_table
  end

  def set_table_title
    @tb.title = "交租阶段信息"
  end

  def set_table_headings
    @tb.headings = ["开始日期", "结束日期", "交租日期", "交租阶段总租金"]
  end


  def set_align_column
    @tb.number_of_columns.times do |index|
      @tb.align_column(index + 1, :right)
    end
    @tb.align_column(0, :left)
  end

  def print_table
    puts @tb
    puts
  end
end

rent = Rent.new("2020-11-16", "2021-03-16", 5000, 2)
rent.show_table
ruby 复制代码
+------------+------------+------------+----------------+
|                     交租阶段信息                      |
+------------+------------+------------+----------------+
| 开始日期   | 结束日期   | 交租日期   | 交租阶段总租金 |
+------------+------------+------------+----------------+
| 2020-11-16 | 2020-12-31 | 2020-11-16 | 7465.75        |
| 2021-01-01 | 2021-02-28 | 2020-12-15 | 10000.00       |
| 2021-03-01 | 2021-03-16 | 2021-02-15 | 2630.14        |
+------------+------------+------------+----------------+

目前按照一月一交的话,交租日期那块显示还有点问题,这个后面再优化吧。

ruby 复制代码
+------------+------------+------------+----------------+
|                     交租阶段信息                      |
+------------+------------+------------+----------------+
| 开始日期   | 结束日期   | 交租日期   | 交租阶段总租金 |
+------------+------------+------------+----------------+
| 2020-11-16 | 2020-11-30 | 2020-11-16 | 2465.75        |
| 2020-12-01 | 2020-12-31 | 2020-11-15 | 5000.00        |
| 2021-01-01 | 2021-01-31 | 2020-12-15 | 5000.00        |
| 2021-02-01 | 2021-02-28 | 2021-01-15 | 5000.00        |
| 2021-03-01 | 2021-03-16 | 2021-02-15 | 2630.14        |
+------------+------------+------------+----------------+
相关推荐
大熊猫侯佩9 天前
ruby、Python 以及 Swift 语言关于 “Finally” 实现的趣谈
python·ruby·swift
韩曙亮13 天前
【错误记录】Mac 命令行执行 brew 命令报错 ( Error: Failed to upgrade Homebrew Portable Ruby! )
redis·macos·ruby
明似水14 天前
解决 Ruby Gem “rexml“ 版本不兼容问题 (CocoaPods/Firebase 相关错误)
开发语言·ruby·cocoapods
草明20 天前
macOS 查看当前命令行的ruby的安装目录
开发语言·macos·ruby
元气满满的热码式20 天前
Rabbitmq后台无法登录问题解决
分布式·rabbitmq·ruby
舰长11521 天前
mq安装新版-3.13.7的安装
开发语言·后端·ruby
獨枭23 天前
配置 macOS 上的 Ruby 开发环境
开发语言·macos·ruby
计算机毕设定制辅导-无忧学长1 个月前
从 AMQP 到 RabbitMQ:核心组件设计与工作原理(二)
网络·rabbitmq·ruby
showmethetime1 个月前
RabbitMQ实用技巧
分布式·rabbitmq·ruby
ghie90901 个月前
SpringCloud-基于SpringAMQP实现消息队列
后端·spring cloud·ruby