tidb locale_format 源码

  • 2022-09-19
  • 浏览 (247)

tidb locale_format 代码

文件路径:/parser/mysql/locale_format.go

package mysql

import (
	"bytes"
	"strconv"
	"strings"
	"unicode"

	"github.com/pingcap/errors"
)

func formatENUS(number string, precision string) (string, error) {
	var buffer bytes.Buffer
	if unicode.IsDigit(rune(precision[0])) {
		for i, v := range precision {
			if unicode.IsDigit(v) {
				continue
			}
			precision = precision[:i]
			break
		}
	} else {
		precision = "0"
	}
	if number[0] == '-' && number[1] == '.' {
		number = strings.Replace(number, "-", "-0", 1)
	} else if number[0] == '.' {
		number = strings.Replace(number, ".", "0.", 1)
	}

	if (number[:1] == "-" && !unicode.IsDigit(rune(number[1]))) ||
		(!unicode.IsDigit(rune(number[0])) && number[:1] != "-") {
		buffer.Write([]byte{'0'})
		position, err := strconv.ParseUint(precision, 10, 64)
		if err == nil && position > 0 {
			buffer.Write([]byte{'.'})
			buffer.WriteString(strings.Repeat("0", int(position)))
		}
		return buffer.String(), nil
	} else if number[:1] == "-" {
		buffer.Write([]byte{'-'})
		number = number[1:]
	}

	for i, v := range number {
		if unicode.IsDigit(v) {
			continue
		} else if i == 1 && number[1] == '.' {
			continue
		} else if v == '.' && number[1] != '.' {
			continue
		} else {
			number = number[:i]
			break
		}
	}

	comma := []byte{','}
	parts := strings.Split(number, ".")
	pos := 0
	if len(parts[0])%3 != 0 {
		pos += len(parts[0]) % 3
		buffer.WriteString(parts[0][:pos])
		buffer.Write(comma)
	}
	for ; pos < len(parts[0]); pos += 3 {
		buffer.WriteString(parts[0][pos : pos+3])
		buffer.Write(comma)
	}
	buffer.Truncate(buffer.Len() - 1)

	position, err := strconv.ParseUint(precision, 10, 64)
	if err == nil {
		if position > 0 {
			buffer.Write([]byte{'.'})
			if len(parts) == 2 {
				if uint64(len(parts[1])) >= position {
					buffer.WriteString(parts[1][:position])
				} else {
					buffer.WriteString(parts[1])
					buffer.WriteString(strings.Repeat("0", int(position)-len(parts[1])))
				}
			} else {
				buffer.WriteString(strings.Repeat("0", int(position)))
			}
		}
	}

	return buffer.String(), nil
}

func formatZHCN(_ string, _ string) (string, error) {
	return "", errors.New("not implemented")
}

func formatNotSupport(_ string, _ string) (string, error) {
	return "", errors.New("not support for the specific locale")
}

相关信息

tidb 源码目录

相关文章

tidb charset 源码

tidb const 源码

tidb errcode 源码

tidb errname 源码

tidb error 源码

tidb privs 源码

tidb state 源码

tidb type 源码

tidb util 源码

0  赞