ZetCode

Golang strconv.FormatInt

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 Go 中使用 strconv.FormatInt 函数。我们将通过实际示例介绍整数到字符串转换的基础知识。

strconv.FormatInt 函数将整数转换为字符串。它是 Go 中用于格式化数字输出最常用的函数之一。

FormatInt 允许指定转换的基数(2-36)。该函数以指定基数返回整数的字符串表示形式。

基本的 strconv.FormatInt 示例

strconv.FormatInt 最简单的用法是将整数转换为十进制字符串。这里我们展示了基本的转换。

basic_formatint.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := int64(42)
    str := strconv.FormatInt(num, 10)
    
    fmt.Printf("Integer %d converted to string '%s'\n", num, str)
}

我们将整数 42 转换为十进制字符串。该函数接受一个 int64 值,并返回其在指定基数下的字符串表示形式。

转换为不同的基数

strconv.FormatInt 支持转换为各种基数。此示例显示了转换为二进制、八进制、十进制和十六进制。

different_bases.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := int64(42)
    
    fmt.Println("Binary:", strconv.FormatInt(num, 2))
    fmt.Println("Octal:", strconv.FormatInt(num, 8))
    fmt.Println("Decimal:", strconv.FormatInt(num, 10))
    fmt.Println("Hexadecimal:", strconv.FormatInt(num, 16))
}

我们将相同的数字转换为不同的基数。基数 2 是二进制,8 是八进制,10 是十进制,16 是十六进制表示。

处理负数

strconv.FormatInt 可以正确处理负数。此示例演示了负值的转换。

negative_numbers.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := int64(-42)
    
    fmt.Println("Decimal:", strconv.FormatInt(num, 10))
    fmt.Println("Hexadecimal:", strconv.FormatInt(num, 16))
    fmt.Println("Binary:", strconv.FormatInt(num, 2))
}

负数将转换为带前导负号。基数转换的工作方式与正数相同。

FormatInt 与 Itoa 的比较

strconv.Itoa 是十进制转换的更简单替代方法。此示例比较了 FormatInt 和 Itoa。

formatint_vs_itoa.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := int64(42)
    
    // Using FormatInt for base 10
    str1 := strconv.FormatInt(num, 10)
    fmt.Println("FormatInt:", str1)
    
    // Using Itoa (only for base 10)
    str2 := strconv.Itoa(int(num))
    fmt.Println("Itoa:", str2)
}

Itoa 对于 int 值的十进制转换更方便。当需要其他基数或处理 int64 时,需要 FormatInt

性能注意事项

对于性能关键型代码,了解转换成本很重要。此示例将 FormatInt 与其他方法进行基准测试。

performance.go
package main

import (
    "fmt"
    "strconv"
    "time"
)

func main() {
    const iterations = 1000000
    num := int64(12345)
    
    // Benchmark FormatInt
    start := time.Now()
    for i := 0; i < iterations; i++ {
        strconv.FormatInt(num, 10)
    }
    fmt.Println("FormatInt duration:", time.Since(start))
    
    // Benchmark fmt.Sprintf
    start = time.Now()
    for i := 0; i < iterations; i++ {
        fmt.Sprintf("%d", num)
    }
    fmt.Println("Sprintf duration:", time.Since(start))
}

对于整数到字符串的转换,FormatIntfmt.Sprintf 快得多。当性能很重要时,请使用 FormatInt。

替代方法:fmt.Sprintf

fmt.Sprintf 提供了另一种将整数格式化为字符串的方法。此示例将其与 FormatInt 进行比较。

sprintf.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := int64(42)
    
    // Using FormatInt
    str1 := strconv.FormatInt(num, 10)
    fmt.Println("FormatInt result:", str1)
    
    // Using Sprintf
    str2 := fmt.Sprintf("%d", num)
    fmt.Println("Sprintf result:", str2)
}

SprintfFormatInt 更灵活但速度更慢。对于简单转换,请使用 FormatInt;当您需要复杂格式时,请使用 Sprintf。

实际示例:数字格式化

此实际示例演示了如何使用 FormatInt 创建带有填充和不同基数的格式化数字字符串。

number_formatting.go
package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    numbers := []int64{7, 42, 255, 1024, 65535}
    
    for _, num := range numbers {
        // Format with leading zeros
        dec := strconv.FormatInt(num, 10)
        dec = fmt.Sprintf("%06s", dec)
        
        // Format as hexadecimal
        hex := strconv.FormatInt(num, 16)
        hex = strings.ToUpper(hex)
        hex = fmt.Sprintf("0x%04s", hex)
        
        fmt.Printf("%d → Dec: %s, Hex: %s\n", num, dec, hex)
    }
}

我们将数字格式化为带前导零和十六进制前缀。FormatInt 提供基数转换,而 fmt.Sprintf 处理填充。

来源

Go strconv 包文档

本教程通过各种场景下整数到字符串转换的实际示例,介绍了 Go 中的 strconv.FormatInt 函数。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程