package main

import (
	"errors"
	"fmt"
	"strconv"
)

func main() {
	// Atoi: teks menjadi int, error selalu diperiksa.
	n, err := strconv.Atoi("2026")
	if err != nil {
		fmt.Println("galat:", err)
		return
	}
	fmt.Println("Atoi       :", n, "tahun")

	// Itoa: int menjadi teks.
	fmt.Println("Itoa       :", strconv.Itoa(2026))

	// Input salah menghasilkan error, bukan panic.
	n2, err2 := strconv.Atoi("2026abc")
	if err2 != nil {
		fmt.Println("nilai n2   :", n2, "(nol saat gagal)")
		fmt.Println("galat      :", err2)
	}

	// Error strconv bertipe *strconv.NumError.
	if numErr, ok := err2.(*strconv.NumError); ok {
		fmt.Println("NumError   :", numErr.Func, "pada", strconv.Quote(numErr.Num))
	}

	// Penyebab sintaks salah dapat diperiksa dengan errors.Is.
	if errors.Is(err2, strconv.ErrSyntax) {
		fmt.Println("penyebab   : strconv.ErrSyntax")
	}

	// ParseFloat membaca angka desimal.
	f, _ := strconv.ParseFloat("3.5", 64)
	fmt.Println("ParseFloat :", f)

	// FormatFloat dan FormatInt menulis angka kembali jadi teks.
	fmt.Println("FormatFloat:", strconv.FormatFloat(f, 'f', 1, 64))
	fmt.Println("FormatInt  :", strconv.FormatInt(255, 16))

	// Quote meng-escape teks, Unquote membaliknya.
	fmt.Println("Quote      :", strconv.Quote("Halo,\n\"Budi\""))
	s, _ := strconv.Unquote("\"Halo,\\nBudi\"")
	fmt.Println("Unquote    :", s)

	// ParseBool mengenali beberapa bentuk teks boolean.
	for _, teks := range []string{"true", "FALSE", "1", "ya"} {
		b, err3 := strconv.ParseBool(teks)
		fmt.Printf("ParseBool(%q) = %v", teks, b)
		if err3 != nil {
			fmt.Printf(" (galat: %v)", err3)
		}
		fmt.Println()
	}
}
