使用Golang将十进制数字转化为由A-Z(1-26)表示的形式

       标题可能有点奇怪,有人可能会认为这就是一个简单的将十进制数字转化为26进制的数字,但是问题并没有这么简单。我遇到的问题如下:

       已知一组数据的总量,也就是有多少条数据,现在需要将这组数据写入excel表格,但是在表格中只能将数据写在同一行上,这就意味着你不能构造A1-A100(如:将数据写在excel表格的第一列,共100个数据),这种方式,每一个数据要填写的位置索引很容易构造,在Golang中只需要"A" + 1、"A" + 2、"A" + 3、..."A" + 100,通过一个for循环就可以实现,但是如果将数据写在一列,则要构造出每一列的名称,excel表格中列的名称用有A-Z组成的字符串表示,并且存在列名称为AA、AAA的列,因此将A看作0也不好进行换算,经过思索,我想出了下面的解决方法,先上代码:

package main

import (
	"fmt"
)

func Div(Num int)  string{
	var(
		Str string = ""
		k int
		temp []int   //保存转化后每一位数据的值,然后通过索引的方式匹配A-Z
	)
//用来匹配的字符A-Z
	Slice := []string{"","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
		"P","Q","R","S","T","U","V","W","X","Y","Z"}

	if Num >26 {  //数据大于26需要进行拆分
		for {
			k = Num % 26  //从个位开始拆分,如果求余为0,说明末尾为26,也就是Z,如果是转化为26进制数,则末尾是可以为0的,这里必须为A-Z中的一个
			if k == 0 {
				temp = append(temp, 26)
				k = 26
			} else {
				temp = append(temp, k)
			}
			Num = (Num - k) / 26 //减去Num最后一位数的值,因为已经记录在temp中
			if Num <= 26{   //小于等于26直接进行匹配,不需要进行数据拆分
				temp = append(temp, Num)
				break
			}
		}
	}else{
		return Slice[Num]
	}
    
	for _,value := range temp{
		Str = Slice[value] + Str //因为数据切分后存储顺序是反的,所以Str要放在后面
	}
	return Str
}

func main()  {
    //大功告成
	for i:=1;i<200;i++{
		fmt.Println(Div(i))
	}
}

执行结果内容较多,就不展示了。

猜你喜欢

转载自blog.csdn.net/random_w/article/details/88431166
今日推荐