strconv.Atoi în Go

Atoi transformă un text în număr întreg (int) și returnează eroare dacă nu se poate; Itoa face invers.

Sintaxă
func Atoi(s string) (int, error)
func Itoa(i int) string

Ce face strconv.Atoi

strconv.Atoi(s) (de la ASCII to integer) citește un număr întreg în baza 10 dintr-un text: "42" devine 42. Acceptă semn ("-7", "+7"), dar nu spații, puncte, virgule sau alte caractere. Dacă textul nu este un număr valid sau numărul nu încape în int, returnează o eroare de tip *strconv.NumError.

strconv.Itoa(i) face conversia inversă: 42 devine "42". Este echivalent cu strconv.FormatInt(int64(i), 10).

În Go nu poți aduna un text cu un număr ("Nota: " + 10 nu compilează) și nici nu poți converti cu string(10) sau int("10"): pentru asta există strconv.

Parametri

Parametru Descriere
s La Atoi: textul de citit.
i La Itoa: numărul de transformat.

Ce returnează

Atoi: numărul și o eroare (nil dacă a reușit; altfel numărul este 0). Itoa: textul.

Exemple

Exemplul 1: Texte valide și invalide

package main

import (
	"fmt"
	"strconv"
)

func main() {
	for _, s := range []string{"42", "-7", "+15", " 3", "12abc", "3.5", "99999999999999999999"} {
		n, err := strconv.Atoi(s)
		if err != nil {
			fmt.Printf("%-24q eroare: %v\n", s, err)
			continue
		}
		fmt.Printf("%-24q -> %d\n", s, n)
	}
}

Rezultat

"42"                     -> 42
"-7"                     -> -7
"+15"                    -> 15
" 3"                     eroare: strconv.Atoi: parsing " 3": invalid syntax
"12abc"                  eroare: strconv.Atoi: parsing "12abc": invalid syntax
"3.5"                    eroare: strconv.Atoi: parsing "3.5": invalid syntax
"99999999999999999999"   eroare: strconv.Atoi: parsing "99999999999999999999": value out of range

Exemplul 2: Citirea vârstei de la tastatură

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	in := bufio.NewReader(os.Stdin)
	rand, _ := in.ReadString('\n')
	varsta, err := strconv.Atoi(strings.TrimSpace(rand))
	if err != nil {
		fmt.Println("Te rog scrie un număr.")
		return
	}
	fmt.Println("Peste 10 ani vei avea", varsta+10, "ani.")
}

Ce scrie utilizatorul (intrare)

25

Rezultat

Peste 10 ani vei avea 35 ani.

Exemplul 3: Itoa: număr lipit de text

package main

import (
	"fmt"
	"strconv"
)

func main() {
	nota := 10
	mesaj := "Nota Anei: " + strconv.Itoa(nota)
	fmt.Println(mesaj)
	fmt.Println(string(rune(65)), "nu este", strconv.Itoa(65))
}

Rezultat

Nota Anei: 10
A nu este 65

Greșeli frecvente

  • Nu scoți spațiile și rândul nou din textul citit: Atoi("25\n") dă eroare. Aplică întâi strings.TrimSpace.
  • Ignori eroarea cu n, _ := strconv.Atoi(s). La un text greșit primești 0 și programul continuă ca și cum utilizatorul ar fi scris 0.
  • Folosești string(n) în loc de strconv.Itoa(n): obții caracterul cu codul n (pentru 65, litera A), nu cifrele.
  • Folosești Atoi pentru numere cu zecimale ("3.5"): dă eroare. Folosește strconv.ParseFloat.

Comenzi înrudite

  • strconv.ParseInt: Citește un întreg dintr-un text, în orice bază (2–36) și verifică dacă încape într-un anumit număr de biți.
  • strconv.ParseFloat: Citește un număr cu zecimale dintr-un text (cu punct, nu cu virgulă) ca float64.
  • strconv.FormatInt: Transformă un întreg în text, în baza dorită (2–36): binar, octal, zecimal, hexazecimal.
  • fmt.Sprint: Transformă valorile în text și îl returnează, fără să afișeze nimic; Sprintln adaugă spații și rând nou.
  • fmt.Sscanf: Citește valori dintr-un text (string) în variabile, ca Scan, Scanf și Scanln, dar fără tastatură.