github.com/webx-top/com@v1.2.12/decimal.go (about)

     1  package com
     2  
     3  import (
     4  	"fmt"
     5  	"math"
     6  	"strings"
     7  )
     8  
     9  func Float2int(v interface{}) int {
    10  	s := fmt.Sprintf("%v", v)
    11  	i := strings.SplitN(s, `.`, 2)[0]
    12  	return Int(i)
    13  }
    14  
    15  func Float2uint(v interface{}) uint {
    16  	s := fmt.Sprintf("%v", v)
    17  	i := strings.SplitN(s, `.`, 2)[0]
    18  	return Uint(i)
    19  }
    20  
    21  func Float2int64(v interface{}) int64 {
    22  	s := fmt.Sprintf("%v", v)
    23  	i := strings.SplitN(s, `.`, 2)[0]
    24  	return Int64(i)
    25  }
    26  
    27  func Float2uint64(v interface{}) uint64 {
    28  	s := fmt.Sprintf("%v", v)
    29  	i := strings.SplitN(s, `.`, 2)[0]
    30  	return Uint64(i)
    31  }
    32  
    33  func NumberTrim(number string, precision int, separator ...string) string {
    34  	s := number
    35  	if len(s) == 0 {
    36  		if precision <= 0 {
    37  			return `0`
    38  		}
    39  		return `0.` + strings.Repeat(`0`, precision)
    40  	}
    41  	p := strings.LastIndex(s, `.`)
    42  	if p < 0 {
    43  		if precision > 0 {
    44  			s += `.` + strings.Repeat(`0`, precision)
    45  		}
    46  		return numberWithSeparator(s, separator...)
    47  	}
    48  	if precision <= 0 {
    49  		return numberWithSeparator(s[0:p], separator...)
    50  	}
    51  	r := s[p+1:]
    52  	if len(r) >= precision {
    53  		return numberWithSeparator(s[0:p]+`.`+r[0:precision], separator...)
    54  	}
    55  	return numberWithSeparator(s, separator...)
    56  }
    57  
    58  func NumberTrimZero(number string) string {
    59  	p := strings.LastIndex(number, `.`)
    60  	if p < 0 {
    61  		return number
    62  	}
    63  	d := strings.TrimRight(number[p+1:], `0`)
    64  	if len(d) == 0 {
    65  		return number[0:p]
    66  	}
    67  	return number[0:p] + `.` + d
    68  }
    69  
    70  func numberWithSeparator(r string, separator ...string) string {
    71  	d := `,`
    72  	if len(separator) > 0 {
    73  		d = separator[0]
    74  		if len(d) == 0 {
    75  			return r
    76  		}
    77  	}
    78  	p := strings.LastIndex(r, `.`)
    79  	var (
    80  		i int
    81  		v string
    82  	)
    83  	size := len(r)
    84  	if p <= 0 {
    85  		i = size
    86  	} else {
    87  		i = p
    88  		v = r[i:]
    89  	}
    90  	j := int(math.Ceil(float64(i) / float64(3)))
    91  	s := make([]string, j)
    92  	for i > 0 && j > 0 {
    93  		j--
    94  		start := i - 3
    95  		if start < 0 {
    96  			start = 0
    97  		}
    98  		s[j] = r[start:i]
    99  		i = start
   100  	}
   101  	return strings.Join(s, d) + v
   102  }
   103  
   104  func NumberFormat(number interface{}, precision int, separator ...string) string {
   105  	r := fmt.Sprintf(`%.*f`, precision, Float64(number))
   106  	return numberWithSeparator(r, separator...)
   107  }