如何在Go语言中对齐小数点打印float64类型的列表
如何在Go语言中对齐小数点打印float64类型的列表
嘿,这个需求其实完全不用自己手动拆分整数和小数部分哦,Go的标准库已经给我们准备好了现成的工具,轻松就能实现所有行小数点对齐的效果!
方法一:固定宽度格式化(最简单直接)
如果你的数字范围大致可控,直接用fmt.Printf的格式化字符串就能搞定。核心是使用%f格式化动词,同时指定总宽度和小数精度,Go会自动帮你对齐小数点。
比如我们要保留2位小数,总宽度设为10(包含整数部分、小数点、小数部分的所有字符),代码示例如下:
package main import "fmt" func main() { nums := []float64{1.234, 12.34, 123.4, 0.12, 1234.56, -7.89} // %10.2f 表示总宽度10,保留2位小数,自动对齐小数点 for _, num := range nums { fmt.Printf("%10.2f\n", num) } }
运行后输出的结果会是这样的(所有小数点完美对齐):
1.23 12.34 123.40 0.12 1234.56 -7.89
这里的10是总宽度,如果数字的整数部分长度超过这个值,Go会自动突破宽度限制保证数字完整显示,不用担心截断问题。
方法二:动态计算宽度(适配任意数字范围)
如果你的切片里数字大小差异很大,没法提前确定固定宽度,那可以先遍历一次切片,找出整数部分的最大长度,再动态生成格式化字符串,这样不管多大的数字都能精准对齐。
代码示例:
package main import ( "fmt" "math" ) func main() { nums := []float64{1.234, 12.34, 123.4, 0.12, 1234.56, 78901.23, -456.7} decimalPlaces := 2 // 我们要保留的小数位数 maxIntWidth := 0 // 先遍历一次,找出最长的整数部分长度(处理负数的话要取绝对值) for _, num := range nums { intPart := int(math.Abs(num)) intLen := len(fmt.Sprintf("%d", intPart)) if intLen > maxIntWidth { maxIntWidth = intLen } } // 总宽度 = 整数部分最大长度 + 1(小数点) + 小数位数 totalWidth := maxIntWidth + 1 + decimalPlaces // 动态生成格式化字符串 formatStr := fmt.Sprintf("%%%d.%df\n", totalWidth, decimalPlaces) // 开始打印 for _, num := range nums { fmt.Printf(formatStr, num) } }
这个方法的好处是完全适配任意范围的数字,不用提前预估宽度,灵活性拉满。
方法三:用tabwriter处理复杂表格场景
如果你的输出是更复杂的表格结构,Go标准库的text/tabwriter包能帮你自动对齐所有列,包括小数点的位置,非常适合批量输出结构化数据:
package main import ( "os" "text/tabwriter" ) func main() { nums := []float64{1.234, 12.34, 123.4, 0.12, 1234.56} // 初始化tabwriter:输出到标准输出,最小宽度8,制表符宽度4,填充空格,右对齐 w := tabwriter.NewWriter(os.Stdout, 8, 4, 1, ' ', tabwriter.AlignRight) defer w.Flush() // 别忘了最后刷新缓冲区 decimalPlaces := 2 formatStr := fmt.Sprintf("%%.%df\n", decimalPlaces) for _, num := range nums { fmt.Fprintf(w, formatStr, num) } }
这个包会自动帮你处理列的对齐,即使数字长度不一,也能保证小数点整齐划一。
备注:内容来源于stack exchange,提问作者Thomas Höhenleitner
相关产品推荐
相关产品推荐

