From 78ceded6e90699a5da5297d2a6cf908ad9bf6c4c Mon Sep 17 00:00:00 2001 From: siddharth Date: Mon, 17 Jan 2022 18:20:29 -0500 Subject: lib: add StrToNum --- lib/str.go | 28 ++++++++++++++++++++++++++++ lib/str_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 lib/str_test.go diff --git a/lib/str.go b/lib/str.go index 857268d..2f6ece4 100644 --- a/lib/str.go +++ b/lib/str.go @@ -153,3 +153,31 @@ func StrHas(s, n string) bool { } return false } + +// Converts a string to an integer. +func StrToNum(s string) (int, error) { + var negative bool + var n int + + if len(s) < 1 { + return 0, CPError{"invalid number"} + } + if s[0] == '-' { + negative = true + s = s[1:] + } + u := 1 + for i := len(s) - 1; i >= 0; i-- { + b := s[i] + if b >= '0' && b <= '9' { + n += int(b-48) * u + u *= 10 + } else { + return 0, CPError{"invalid number"} + } + } + if negative { + n *= -1 + } + return n, nil +} diff --git a/lib/str_test.go b/lib/str_test.go new file mode 100644 index 0000000..1b1bb60 --- /dev/null +++ b/lib/str_test.go @@ -0,0 +1,42 @@ +// Copyright © 2022 siddharth +// SPDX-License-Identifier: ISC + +package lib + +import "testing" + +func TestStrToNum(t *testing.T) { + // Test 1 + s1 := "29283329" + n1, err := StrToNum(s1) + if err != nil { + t.Errorf("test 1 failed: %v\n", err) + } + if n1 != 29283329 { + t.Errorf("test 1 failed: %v != %v\n", s1, n1) + } + + // Test 2 + s2 := "-83729282" + n2, err := StrToNum(s2) + if err != nil { + t.Errorf("test 2 failed: %v\n", err) + } + if n2 != -83729282 { + t.Errorf("test 2 failed: %v != %v\n", s2, n2) + } + + // Test 3 + s3 := "887232.2323" + _, err = StrToNum(s3) + if err == nil { + t.Errorf("test 3 failed\n") + } + + // Test 4 + s4 := "332e323" + _, err = StrToNum(s4) + if err == nil { + t.Errorf("test 4 failed\n") + } +} -- cgit v1.2.3