Как перевести строку в число и обратно
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). Текст ошибки подсказывает причину:
strconv.Atoi: parsing "12a": invalid syntax— в строке не только цифры;strconv.Atoi: parsing "": invalid syntax— пустая строка;strconv.Atoi: parsing "99999999999999999999": value out of range— число не помещается вint.
Писать n, _ := strconv.Atoi(s) можно, только если строка точно правильная: иначе неверные данные молча превратятся в 0.
Пробелы и перевод строки
Atoi не пропускает пробелы: " 42" и "42\n" — ошибка invalid syntax. Так бывает, если строка прочитана через bufio.Reader.ReadString('\n'): перевод строки остаётся в конце. Уберите лишнее функцией strings.TrimSpace:
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 и переводят каждую:
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Подводные камни
string(65)— это не "65". Преобразованиеstring(n)для числа даёт символ с таким кодом:"A". Число в строку переводятstrconv.Itoaилиfmt.Sprint.- Дробное число — только с точкой.
strconv.ParseFloat("2,5", 64)вернёт ошибку. Если пользователь вводит запятую, замените её:strings.ReplaceAll(s, ",", "."). - int64 и int.
ParseIntвозвращаетint64, даже если указать 32 бита. Для обычной переменнойintнужно преобразование:int(v). - Цифра-символ. Символ
'7'переводится в число безstrconv:int('7' - '0')даёт 7.