Глиф Учебники

Как перевести строку в число и обратно

Справочник · Go · 1 минута чтения

Go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    n, err := strconv.Atoi("123")
    if err != nil {
        fmt.Println("ошибка:", err)
        return
    }
    fmt.Println(n + 1)

    s := strconv.Itoa(n * 2)
    fmt.Println(s + "!")

    f, err := strconv.ParseFloat("2.5", 64)
    if err != nil {
        fmt.Println("ошибка:", err)
        return
    }
    fmt.Println(f * 2)

    _, err = strconv.Atoi("12a")
    fmt.Println(err)
}
Вывод
124
246!
5
strconv.Atoi: parsing "12a": invalid syntax

Все функции — из пакета strconv:

ФункцияЧто делает
strconv.Atoi(s)строка → int, плюс ошибка
strconv.Itoa(n)int → строка
strconv.ParseInt(s, 10, 64)строка → int64; 10 — система счисления
strconv.ParseFloat(s, 64)строка → float64
strconv.FormatFloat(f, 'f', 2, 64)float64 → строка с двумя знаками после точки
fmt.Sprintf("%d", n)любое значение → строка по формату

Имена Atoi и Itoa пришли из языка C: «ASCII to integer» и обратно.

Ошибку проверяют всегда

Atoi возвращает два значения: число и ошибку. Если строка — не целое число, ошибка не nil, а числом пользоваться нельзя (обычно это 0). Текст ошибки подсказывает причину:

Писать n, _ := strconv.Atoi(s) можно, только если строка точно правильная: иначе неверные данные молча превратятся в 0.

Пробелы и перевод строки

Atoi не пропускает пробелы: " 42" и "42\n" — ошибка invalid syntax. Так бывает, если строка прочитана через bufio.Reader.ReadString('\n'): перевод строки остаётся в конце. Уберите лишнее функцией strings.TrimSpace:

Go
package main

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

func main() {
    line := "  42\n"
    n, err := strconv.Atoi(strings.TrimSpace(line))
    if err != nil {
        fmt.Println("ошибка:", err)
        return
    }
    fmt.Println(n * 10)
}
Вывод
420

Несколько чисел в одной строке

Строку делят на части strings.Fields и переводят каждую:

Go
package main

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

func main() {
    sum := 0
    for _, part := range strings.Fields("10 20 abc 30") {
        n, err := strconv.Atoi(part)
        if err != nil {
            fmt.Println("пропущено:", part)
            continue
        }
        sum += n
    }
    fmt.Println("сумма:", sum)
}
Вывод
пропущено: abc
сумма: 60

Подводные камни