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  }