From 623e03ddc808240743331176ad62dde274abf67c Mon Sep 17 00:00:00 2001
From: Cornelius Rautenbach <cornel.rautenbach@gmail.com>
Date: Thu, 16 Sep 2021 10:54:26 +0200
Subject: [PATCH] Added string utils

---
 .gitignore                   |  1 +
 string_utils/string_utils.go | 85 ++++++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+)
 create mode 100644 string_utils/string_utils.go

diff --git a/.gitignore b/.gitignore
index 66fd13c..474488e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,4 @@
 
 # Dependency directories (remove the comment below to include it)
 # vendor/
+.idea
diff --git a/string_utils/string_utils.go b/string_utils/string_utils.go
new file mode 100644
index 0000000..9afd034
--- /dev/null
+++ b/string_utils/string_utils.go
@@ -0,0 +1,85 @@
+package string_utils
+
+import (
+	"golang.org/x/text/runes"
+	"golang.org/x/text/transform"
+	"golang.org/x/text/unicode/norm"
+	"regexp"
+	"strconv"
+	"strings"
+	"unicode"
+)
+
+// ReplaceNonSpacingMarks removes diacritics e.g. êžů becomes ezu
+func ReplaceNonSpacingMarks(str string) string {
+	t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) // Mn: non-spacing marks
+	result, _, _ :=  transform.String(t, str)
+	return result
+}
+
+func RemoveAllWhiteSpaces(s string) string {
+	return strings.ReplaceAll(strings.ReplaceAll(s, " ", ""), "\t", "")
+}
+
+func ReplaceCaseInsensitive(string, toReplace, replaceWith string) string {
+	regex := regexp.MustCompile("(?i)" + strings.ToLower(toReplace))
+	return regex.ReplaceAllString(string, replaceWith)
+}
+
+// StringTrimQuotes - trims quotes from a string (ie: "foo" will return foo)
+func StringTrimQuotes(stringToTrim string) string {
+	if len(stringToTrim) >= 2 {
+		if stringToTrim[0] == '"' && stringToTrim[len(stringToTrim)-1] == '"' {
+			return stringToTrim[1 : len(stringToTrim)-1]
+		}
+	}
+
+	return stringToTrim
+}
+
+// IsNumericString returns true if the string can be converted to a float without error
+func IsNumericString(s string) bool {
+	_, err := strconv.ParseFloat(s, 64)
+	return err == nil
+}
+
+// Standardise phone numbers with +27 instead of 0 prefix
+func StandardisePhoneNumber(number string) string {
+	// is the first rune/char of the string a 0
+	if []rune(number)[0] == []rune("0")[0] {
+		// Add south african country code (hardcoded for now)
+		number = "+27" + number[1:len(number)]
+	}
+	return number
+}
+
+func FormatPhoneNumber(phoneNumber string) string {
+	if len(phoneNumber) > 7 {
+		return phoneNumber
+	}
+
+	// Format as 076 453 2188
+	phoneNumber = InsertInto(phoneNumber, 3, " ")
+	phoneNumber = InsertInto(phoneNumber, 7, " ")
+	return phoneNumber
+}
+
+func InsertInto(s string, index int, characters string) string {
+	return s[:index] + characters + s[index:]
+}
+
+func IsAlphaNumeric(str string) bool {
+	regex := regexp.MustCompile("^[a-zA-Z0-9]*$")
+	return regex.MatchString(str)
+}
+
+func Equal(a string, b string) bool {
+	return strings.TrimSpace(strings.ToLower(a)) == strings.TrimSpace(strings.ToLower(b))
+}
+
+func UnwrapString(s *string) string {
+	if s == nil {
+		return ""
+	}
+	return *s
+}
\ No newline at end of file
-- 
GitLab