golang 年级转换入学年份
* map.txt
'高三' => '03-2016','高二' => '03-2017','高一' => '03-2018','初三' => '02-2016','初二' => '02-2017','初一' => '02-2018','小六' => '01-2013',// 五四制的初中'六年级'=>'02-2018','七年级'=>'02-2017','八年级'=>'02-2016','九年级'=>'02-2015','高中' => '03-0000','初中' => '02-0000','小学' => '01-0000',
* format.php
// 用于生成test case
<?phpfunction fileForEachRow($path, $handler) {$handle = fopen($path, "r");if (! $handle ) {return;}while (($buffer = fgets($handle, 1024) ) !== false) {$buffer = trim($buffer);call_user_func($handler, $buffer);}if (!feof($handle)) {echo "Error: unexpected fgets() fail\n";}fclose($handle);
}fileForEachRow("map.txt", function($line) {$line = trim($line);$n = strlen($line);if ($n === 0) {return;}if (substr($line, 0, 2) === "//") {return;}// echo $line.PHP_EOL;$col = explode("=>", $line);for ($i = 0; $i < count($col); $i++) {$col[$i] = trim($col[$i], ", \t'\"");}$grade = $col[0];$zh = $col[1];printf("assert.Equal(t, ConvertGradeChinese2Gradeno(\"%s\", now), \"%s\")\n", $grade, $zh);});
* converter.go
注意golang switch case语句自动添加break
如果不需要break,必须用fallthrough关键字
package utilimport ("fmt""github.com/pkg/errors""time"
)type Converter struct{}var GRADE_NAME_TO_ID map[string]stringfunc (this *Converter) init() {if len(GRADE_NAME_TO_ID) == 0 {// GRADE_NAME_TO_ID = getMapGradeName2ID()GRADE_NAME_TO_ID = GetMapGradeName2IdByTime(time.Now())}
}func (this *Converter) GradeChinese2Gradeno(grade string) string {this.init()return GRADE_NAME_TO_ID[grade]
}func ConvertGradeChinese2Gradeno(grade string, date time.Time) string {// 不变的3种情况switch grade {case "高中": return "03-0000"case "初中": return "02-0000"case "小学": return "01-0000"default:}year := date.Year()month := int32(date.Month())// 每年7月1日0点更新 下半学年(上半年)if month >= 7 {year += 1}gmy := &GradeMonthYear{}gmy.getByRune(grade, int32(year))return gmy.toString()
}type CompareFunc func(interface{}, interface{}) int32func indexOf(a []interface{}, e interface{}, cmp CompareFunc) int32 {n := int32(len(a))var i int32 = 0for ; i < n; i++ {if cmp(e, a[i]) == 0 {return i}}return -1
}type GradeMonthYear struct {Month int32Year int32
}func (this *GradeMonthYear) toString() string {return fmt.Sprintf("%02d-%04d", this.Month, this.Year)
}func (this *GradeMonthYear) getByRune(ws string, year int32) error {zh := []rune{'零', '一', '二', '三', '四', '五', '六', '七', '八', '九'}zh_Numbers := make([]interface{}, len(zh))for i, v := range zh {zh_Numbers[i] = v}runeCmp := func(i interface{}, i2 interface{}) int32 {a := i.(int32)b := i2.(int32)return a - b}r := []rune(ws)switch r[0] {case '高':this.Month = 3case '初':this.Month = 2case '小':this.Month = 1case '六': fallthroughcase '七': fallthroughcase '八': fallthroughcase '九':gradeIndex54 := indexOf(zh_Numbers, r[0], runeCmp)this.Year = year - int32(gradeIndex54-5)this.Month = 2return nildefault:errors.New("Unexpected grade name: " + ws)}gradeIndex := indexOf(zh_Numbers, r[1], runeCmp)if gradeIndex >= 0 {this.Year = year - gradeIndex} else {// 小学 高中 初中if r[1] != '年' {this.Year = 0}}return nil
}func GetMapGradeName2IdByTime(time time.Time) map[string]string {var s = time.Format("2006-01-02 15:04:00")var year, month, day, hour, minute, second int32fmt.Sscanf(s, "%d-%d-%d %d:%d:%d:%d", &year, &month, &day, &hour, &minute, &second)// 每年7月1日0点更新 下半学年(上半年)if month >= 7 {year += 1}a := []string{"高三", "高二", "高一", "初三", "初二", "初一", "小六", "六年级", "七年级", "八年级", "九年级", "高中", "初中", "小学"}m := map[string]string{}for _, e := range a {gmy := GradeMonthYear{}gmy.getByRune(e, year)m[e] = gmy.toString()}return m
}
* converter_test.go
package utilimport ("github.com/magiconair/properties/assert""testing""time"
)func TestConvertGradeChinese2Gradeno(t *testing.T) {now := time.Now()assert.Equal(t, ConvertGradeChinese2Gradeno("高三", now), "03-2016")assert.Equal(t, ConvertGradeChinese2Gradeno("高二", now), "03-2017")assert.Equal(t, ConvertGradeChinese2Gradeno("高一", now), "03-2018")assert.Equal(t, ConvertGradeChinese2Gradeno("初三", now), "02-2016")assert.Equal(t, ConvertGradeChinese2Gradeno("初二", now), "02-2017")assert.Equal(t, ConvertGradeChinese2Gradeno("初一", now), "02-2018")assert.Equal(t, ConvertGradeChinese2Gradeno("小六", now), "01-2013")assert.Equal(t, ConvertGradeChinese2Gradeno("六年级", now), "02-2018")assert.Equal(t, ConvertGradeChinese2Gradeno("七年级", now), "02-2017")assert.Equal(t, ConvertGradeChinese2Gradeno("八年级", now), "02-2016")assert.Equal(t, ConvertGradeChinese2Gradeno("九年级", now), "02-2015")assert.Equal(t, ConvertGradeChinese2Gradeno("高中", now), "03-0000")assert.Equal(t, ConvertGradeChinese2Gradeno("初中", now), "02-0000")assert.Equal(t, ConvertGradeChinese2Gradeno("小学", now), "01-0000")
}func TestGetMapGradeName2IdByTime(t *testing.T) {now := time.Now()gradeMap := GetMapGradeName2IdByTime(now)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}}func TestGetMapGradeName2IdByTime_1(t *testing.T) {date := time.Date(2019, 7, 1, 0, 0, 0, 0, time.Local)gradeMap := GetMapGradeName2IdByTime(date)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}
}func TestGetMapGradeName2IdByTime_2(t *testing.T) {date := time.Date(2020, 6, 30, 23, 0, 0, 0, time.Local)gradeMap := GetMapGradeName2IdByTime(date)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}
}func TestGetMapGradeName2IdByTime_3(t *testing.T) {date := time.Date(2020, 7, 1, 0, 0, 0, 0, time.Local)gradeMap := GetMapGradeName2IdByTime(date)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}
}
* test:
go test -v
=== RUN TestConvertGradeChinese2Gradeno
--- PASS: TestConvertGradeChinese2Gradeno (0.00s)
=== RUN TestGetMapGradeName2IdByTime
--- PASS: TestGetMapGradeName2IdByTime (0.00s)converter_test.go:34: 高三 => 03-2016converter_test.go:34: 初一 => 02-2018converter_test.go:34: 八年级 => 02-2016converter_test.go:34: 九年级 => 02-2015converter_test.go:34: 小学 => 01-0000converter_test.go:34: 初三 => 02-2016converter_test.go:34: 高一 => 03-2018converter_test.go:34: 初二 => 02-2017converter_test.go:34: 小六 => 01-2013converter_test.go:34: 七年级 => 02-2017converter_test.go:34: 高二 => 03-2017converter_test.go:34: 六年级 => 02-2018converter_test.go:34: 高中 => 03-0000converter_test.go:34: 初中 => 02-0000
=== RUN TestGetMapGradeName2IdByTime_1
--- PASS: TestGetMapGradeName2IdByTime_1 (0.00s)converter_test.go:43: 初一 => 02-2019converter_test.go:43: 高二 => 03-2018converter_test.go:43: 小六 => 01-2014converter_test.go:43: 六年级 => 02-2019converter_test.go:43: 八年级 => 02-2017converter_test.go:43: 九年级 => 02-2016converter_test.go:43: 高中 => 03-0000converter_test.go:43: 高三 => 03-2017converter_test.go:43: 七年级 => 02-2018converter_test.go:43: 初中 => 02-0000converter_test.go:43: 初三 => 02-2017converter_test.go:43: 初二 => 02-2018converter_test.go:43: 小学 => 01-0000converter_test.go:43: 高一 => 03-2019
=== RUN TestGetMapGradeName2IdByTime_2
--- PASS: TestGetMapGradeName2IdByTime_2 (0.00s)converter_test.go:51: 八年级 => 02-2017converter_test.go:51: 初一 => 02-2019converter_test.go:51: 六年级 => 02-2019converter_test.go:51: 九年级 => 02-2016converter_test.go:51: 高三 => 03-2017converter_test.go:51: 初二 => 02-2018converter_test.go:51: 小六 => 01-2014converter_test.go:51: 七年级 => 02-2018converter_test.go:51: 高中 => 03-0000converter_test.go:51: 小学 => 01-0000converter_test.go:51: 高一 => 03-2019converter_test.go:51: 初三 => 02-2017converter_test.go:51: 高二 => 03-2018converter_test.go:51: 初中 => 02-0000
=== RUN TestGetMapGradeName2IdByTime_3
--- PASS: TestGetMapGradeName2IdByTime_3 (0.00s)converter_test.go:59: 高一 => 03-2020converter_test.go:59: 九年级 => 02-2017converter_test.go:59: 小学 => 01-0000converter_test.go:59: 初一 => 02-2020converter_test.go:59: 八年级 => 02-2018converter_test.go:59: 高中 => 03-0000converter_test.go:59: 初中 => 02-0000converter_test.go:59: 高二 => 03-2019converter_test.go:59: 初三 => 02-2018converter_test.go:59: 小六 => 01-2015converter_test.go:59: 六年级 => 02-2020converter_test.go:59: 七年级 => 02-2019converter_test.go:59: 高三 => 03-2018converter_test.go:59: 初二 => 02-2019
PASSProcess finished with exit code 0
golang 年级转换入学年份相关推荐
- golang时间戳转换
golang时间戳转换 1.获取当前的时间 // unix 时间 fmt.Println(time.Now().Unix())// 格式化 const baseFormat = "2006- ...
- Golang二进制转换十进制代码
为什么80%的码农都做不了架构师?>>> Golang二进制转换十进制代码,使用 container/list 实现出入栈操作,完成转换. 二进制转十进制的方法是:从右到左 ...
- 学生选课系统-学年学期选择器,根据入学年份自动计算当前学期
实现效果,一进入自动加载最近学期数据 入学年份是取学号中入学年份对应字段 js //计算学期 function getTerm(no){ //no为学号let date=new Date; //当前时 ...
- golang 编码转换 gbk
(一)golang 官方转换包 go get golang.org/x/text/encoding https://godoc.org/golang.org/x/text 注:Go里面内 ...
- 入学年份 mysql_MySQl的学习1___概述
1.关系型数据库的管理系统: 比如当前有两张表:学生信息表(学号,姓名,性别,身份证号,学院,专业,入学时间),学生成绩表(学号,科目,成绩)我们可以根据一个学生的学号查找到他的某一学科的成绩,即两张 ...
- golang编码转换
问题:在 Golang 的调试过程中出现中文乱码 原因:Golang 默认不支持 UTF-8 以外的字符集 解决:将字符串的编码转换成UTF-8 首先需要 mahonia 这个包 go get git ...
- golang string 转换 uint64_Golang 的 #x27;print#x27; 源码解读
和其他编程语言一样,Golang也有很多类型的输出方式,这些输出都是通过fmt包来实现的,以下是主要输出方式的源码,路径在fmt/print.go下,源码随简单,理解起来也很容易,阅读理解一遍后记忆更 ...
- 入学年份(year)
包河区2021年信息学竞赛试题 题目描述 Description 随着二胎.三胎的放开,小区里的小宝宝是越来越多了.每个小宝宝到了合适的年龄都会上幼儿园,然后上小学-.根据学籍管理相关规定2021年秋 ...
- Golang html转换图片,将HTML转换为图像
软件需求 以下软件包可用于Windows和Linux系统,并且是完整,有效的解决方案所必需的: gvim - Used to export syntax highlighted source code ...
最新文章
- 5G和AI机器人平台
- C/C++函数形参传实参时值传递、指针传递、引用传递的区别
- 每天一个设计模式,工厂方法模式(Factory Method)
- [HDU5215]Cycle
- 基于windows10+Anaconda3+Python搭建配置TensorFlow、Keras、Jupyter Notebook库,下载Kaggle狗猫数据集完成原始数据直接训练和数据增强后训练
- Python中断多重循环的几种思路exit_flag
- 湖南附中模拟day1 瞭望塔
- 商城购物车php代码,php网上商城购物车代码一例
- android gridview 详解,Android开发 GridView详解
- 深入浅出PID控制算法(二)——PID算法离散化和增量式PID算法原理及Matlab实现
- linux androidx86双系统,ubuntu下安装RemixOS双系统(Android x86)
- 【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…
- 微机原理第五章 存储器
- [HDCTF2019]bbbbbbrsa
- 使用opencv创建一张纯黑色的图片与其他图片进行合成
- Office 如何添加Adobe Acrobat虚拟PDF打印机
- 我们是“前端offer收割机”
- pkcs5 padding和pkcs7 padding的区别
- Altium Designer 10 (AD10)制作贴片图
- 2010.06.27 可可网络验证系统
热门文章
- A类 B类 AB类 D类 K类功放简单对比
- html table rownum,Python+Selenium获取HTML-Table表格数据
- 【数据库】02 SQL语句
- 2021年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项
- 基于PHP+MySQL的个性化智能餐饮推荐系统
- CODESYS学习手册
- Additive equations
- C#面向对象的UML工具:StarUML介绍和入门使用
- 原始GPS经纬度转换为距离(c/c++)
- 二级MySQL,未来教育MySQL题库,15套试卷,sql题答案。