296 lines
5.7 KiB
Go
296 lines
5.7 KiB
Go
package strutil
|
|
|
|
import (
|
|
"bytes"
|
|
"math"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
fingerNum = 10
|
|
zeroChr = '0'
|
|
)
|
|
|
|
// Reverse is a function that returns a string in reverse order.
|
|
func Reverse(s string) string {
|
|
runes := []rune(s)
|
|
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
|
runes[i], runes[j] = runes[j], runes[i]
|
|
}
|
|
return string(runes)
|
|
}
|
|
|
|
// FormatIntToStringReversed is a function that converts number to decimal string reversed order(LSB).
|
|
func FormatIntToStringReversed(number int) (out string) {
|
|
if number == 0 {
|
|
return "0"
|
|
}
|
|
var (
|
|
buf strings.Builder
|
|
digit int
|
|
sign = number < 0
|
|
)
|
|
if sign {
|
|
number = -number
|
|
}
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
buf.WriteByte(zeroChr + byte(digit))
|
|
}
|
|
if sign {
|
|
buf.WriteByte('-')
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
// FormatIntToString is a function that converts number to decimal string(MSB).
|
|
func FormatIntToString(number int) (out string) {
|
|
if number == 0 {
|
|
return "0"
|
|
}
|
|
var (
|
|
buf strings.Builder
|
|
digit int
|
|
sign = number < 0
|
|
)
|
|
|
|
if sign {
|
|
number = -number
|
|
buf.WriteByte('-')
|
|
}
|
|
|
|
var (
|
|
maxDigit = int(math.Log10(float64(number))) + 1
|
|
numBuf = make([]byte, maxDigit)
|
|
)
|
|
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
numBuf[maxDigit-radix-1] = zeroChr + byte(digit)
|
|
}
|
|
buf.Write(numBuf)
|
|
|
|
return buf.String()
|
|
}
|
|
|
|
// FormatIntToBytesReversed is a function that converts number to decimal byte array(ASCII code based) reversed order(LSB).
|
|
func FormatIntToBytesReversed(number int) (out []byte) {
|
|
if number == 0 {
|
|
return []byte("0")
|
|
}
|
|
var (
|
|
buf bytes.Buffer
|
|
digit int
|
|
sign = number < 0
|
|
)
|
|
|
|
if sign {
|
|
number = -number
|
|
}
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
buf.WriteByte(zeroChr + byte(digit))
|
|
}
|
|
|
|
if sign {
|
|
buf.WriteByte('-')
|
|
}
|
|
return buf.Bytes()
|
|
}
|
|
|
|
// FormatIntToBytes is a function that converts number to decimal byte array(ASCII code based,MSB).
|
|
func FormatIntToBytes(number int) (out []byte) {
|
|
if number == 0 {
|
|
return []byte("0")
|
|
}
|
|
|
|
var (
|
|
digit int
|
|
sign = number < 0
|
|
maxDigit int
|
|
)
|
|
|
|
if sign {
|
|
number = -number
|
|
maxDigit = int(math.Log10(float64(number))) + 2
|
|
} else {
|
|
maxDigit = int(math.Log10(float64(number))) + 1
|
|
}
|
|
|
|
out = make([]byte, maxDigit)
|
|
if sign {
|
|
out[0] = '-'
|
|
}
|
|
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
out[maxDigit-radix-1] = zeroChr + byte(digit)
|
|
}
|
|
return
|
|
}
|
|
|
|
// ParseStringToInt is a function that converts a decimal string to integer.
|
|
func ParseStringToInt(in string) (number int) {
|
|
if len(in) == 0 {
|
|
return
|
|
}
|
|
|
|
var (
|
|
out []uint8
|
|
sign = in[0] == '-'
|
|
)
|
|
if sign {
|
|
out = make([]uint8, 0, len(in)-1)
|
|
in = in[1:]
|
|
} else {
|
|
out = make([]uint8, 0, len(in))
|
|
}
|
|
for _, digit := range in {
|
|
if digit < '0' || digit > '9' {
|
|
continue
|
|
}
|
|
out = append(out, byte(digit-'0'))
|
|
}
|
|
scanned := len(out)
|
|
pow := 1
|
|
|
|
for i := scanned; i > 0; i-- {
|
|
number += pow * int(out[i-1])
|
|
pow *= 10
|
|
}
|
|
|
|
if sign {
|
|
number = -number
|
|
}
|
|
return
|
|
}
|
|
|
|
// ParseBytesToInt is a function that converts a decimal byte array(ASCII based) to integer.
|
|
func ParseBytesToInt(in []byte) (number int) {
|
|
if len(in) == 0 {
|
|
return -1
|
|
}
|
|
|
|
var (
|
|
out []uint8
|
|
sign = in[0] == '-'
|
|
)
|
|
|
|
if sign {
|
|
out = make([]uint8, 0, len(in)-1)
|
|
in = in[1:]
|
|
} else {
|
|
out = make([]uint8, 0, len(in))
|
|
}
|
|
|
|
for _, digit := range in {
|
|
if digit < '0' || digit > '9' {
|
|
continue
|
|
}
|
|
out = append(out, digit-'0')
|
|
}
|
|
scanned := len(out)
|
|
if scanned == 0 {
|
|
return -1
|
|
}
|
|
pow := 1
|
|
|
|
for i := scanned; i > 0; i-- {
|
|
number += pow * int(out[i-1])
|
|
pow *= 10
|
|
}
|
|
|
|
if sign {
|
|
number = -number
|
|
}
|
|
return
|
|
}
|
|
|
|
// FormatUnsignedIntToStringReversed is a function that converts number to decimal string reversed order(LSB).
|
|
func FormatUnsignedIntToStringReversed(sign bool, number uint) (out string) {
|
|
if number == 0 {
|
|
return "0"
|
|
}
|
|
var (
|
|
buf strings.Builder
|
|
digit uint
|
|
)
|
|
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
buf.WriteByte(zeroChr + byte(digit))
|
|
}
|
|
if sign {
|
|
buf.WriteByte('-')
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
// FormatUnsignedIntToString is a function that converts number to decimal string(MSB).
|
|
func FormatUnsignedIntToString(sign bool, number uint) (out string) {
|
|
if number == 0 {
|
|
return "0"
|
|
}
|
|
var (
|
|
buf strings.Builder
|
|
digit uint
|
|
maxDigit = int(math.Log10(float64(number))) + 1
|
|
numBuf = make([]byte, maxDigit)
|
|
)
|
|
if sign {
|
|
buf.WriteByte('-')
|
|
}
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
numBuf[maxDigit-radix-1] = zeroChr + byte(digit)
|
|
}
|
|
|
|
buf.Write(numBuf)
|
|
|
|
return buf.String()
|
|
}
|
|
|
|
// FormatUnsignedIntToBytesReversed is a function that converts number to decimal byte array(ASCII code based) reversed order(LSB).
|
|
func FormatUnsignedIntToBytesReversed(sign bool, number uint) (out []byte) {
|
|
if number == 0 {
|
|
return []byte("0")
|
|
}
|
|
var (
|
|
buf bytes.Buffer
|
|
digit uint
|
|
)
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
buf.WriteByte(zeroChr + byte(digit))
|
|
}
|
|
if sign {
|
|
buf.WriteByte('-')
|
|
}
|
|
return buf.Bytes()
|
|
}
|
|
|
|
// FormatUnsignedIntToBytes is a function that converts number to decimal byte array(ASCII code based, MSB).
|
|
func FormatUnsignedIntToBytes(sign bool, number uint) (out []byte) {
|
|
if number == 0 {
|
|
return []byte("0")
|
|
}
|
|
var (
|
|
digit uint
|
|
maxDigit = int(math.Log10(float64(number))) + 1
|
|
)
|
|
|
|
if sign {
|
|
maxDigit++
|
|
out = make([]byte, maxDigit)
|
|
out[0] = '-'
|
|
} else {
|
|
out = make([]byte, maxDigit)
|
|
}
|
|
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%fingerNum, number/fingerNum
|
|
out[maxDigit-radix-1] = zeroChr + byte(digit)
|
|
}
|
|
return
|
|
}
|