go
/
misc
1
0
Fork 0
misc/strutil/strconv.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
}