github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/sqlparse/tidbparser/dependency/mysql/locale_format.go (about) 1 package mysql 2 3 import ( 4 "bytes" 5 "strconv" 6 "strings" 7 "unicode" 8 9 "github.com/juju/errors" 10 ) 11 12 func formatENUS(number string, precision string) (string, error) { 13 var buffer bytes.Buffer 14 if unicode.IsDigit(rune(precision[0])) { 15 for i, v := range precision { 16 if unicode.IsDigit(v) { 17 continue 18 } else { 19 precision = precision[:i] 20 break 21 } 22 } 23 } else { 24 precision = "0" 25 } 26 if number[0] == '-' && number[1] == '.' { 27 number = strings.Replace(number, "-", "-0", 1) 28 } else if number[0] == '.' { 29 number = strings.Replace(number, ".", "0.", 1) 30 } 31 32 if (number[:1] == "-" && !unicode.IsDigit(rune(number[1]))) || 33 (!unicode.IsDigit(rune(number[0])) && number[:1] != "-") { 34 buffer.Write([]byte{'0'}) 35 position, err := strconv.ParseUint(precision, 10, 64) 36 if err == nil && position > 0 { 37 buffer.Write([]byte{'.'}) 38 buffer.WriteString(strings.Repeat("0", int(position))) 39 } 40 return buffer.String(), nil 41 } else if number[:1] == "-" { 42 buffer.Write([]byte{'-'}) 43 number = number[1:] 44 } 45 46 for i, v := range number { 47 if unicode.IsDigit(v) { 48 continue 49 } else if i == 1 && number[1] == '.' { 50 continue 51 } else if v == '.' && number[1] != '.' { 52 continue 53 } else { 54 number = number[:i] 55 break 56 } 57 } 58 59 comma := []byte{','} 60 parts := strings.Split(number, ".") 61 pos := 0 62 if len(parts[0])%3 != 0 { 63 pos += len(parts[0]) % 3 64 buffer.WriteString(parts[0][:pos]) 65 buffer.Write(comma) 66 } 67 for ; pos < len(parts[0]); pos += 3 { 68 buffer.WriteString(parts[0][pos : pos+3]) 69 buffer.Write(comma) 70 } 71 buffer.Truncate(buffer.Len() - 1) 72 73 position, err := strconv.ParseUint(precision, 10, 64) 74 if err == nil { 75 if position > 0 { 76 buffer.Write([]byte{'.'}) 77 if len(parts) == 2 { 78 if uint64(len(parts[1])) >= position { 79 buffer.WriteString(parts[1][:position]) 80 } else { 81 buffer.WriteString(parts[1]) 82 buffer.WriteString(strings.Repeat("0", int(position)-len(parts[1]))) 83 } 84 } else { 85 buffer.WriteString(strings.Repeat("0", int(position))) 86 } 87 } 88 } 89 90 return buffer.String(), nil 91 } 92 93 func formatZHCN(number string, precision string) (string, error) { 94 return "", errors.New("not implemented") 95 } 96 97 func formatNotSupport(number string, precision string) (string, error) { 98 return "", errors.New("not support for the specific locale") 99 }