gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

price.go (1376B)


      1 package strconv
      2 
      3 // AppendPrice will append an int64 formatted as a price, where the int64 is the price in cents.
      4 // It does not display whether a price is negative or not.
      5 func AppendPrice(b []byte, price int64, dec bool, milSeparator byte, decSeparator byte) []byte {
      6 	if price < 0 {
      7 		if price == -9223372036854775808 {
      8 			x := []byte("92 233 720 368 547 758 08")
      9 			x[2] = milSeparator
     10 			x[6] = milSeparator
     11 			x[10] = milSeparator
     12 			x[14] = milSeparator
     13 			x[18] = milSeparator
     14 			x[22] = decSeparator
     15 			return append(b, x...)
     16 		}
     17 		price = -price
     18 	}
     19 
     20 	// rounding
     21 	if !dec {
     22 		firstDec := (price / 10) % 10
     23 		if firstDec >= 5 {
     24 			price += 100
     25 		}
     26 	}
     27 
     28 	// calculate size
     29 	n := LenInt(price) - 2
     30 	if n > 0 {
     31 		n += (n - 1) / 3 // mil separator
     32 	} else {
     33 		n = 1
     34 	}
     35 	if dec {
     36 		n += 2 + 1 // decimals + dec separator
     37 	}
     38 
     39 	// resize byte slice
     40 	i := len(b)
     41 	if i+n > cap(b) {
     42 		b = append(b, make([]byte, n)...)
     43 	} else {
     44 		b = b[:i+n]
     45 	}
     46 
     47 	// print fractional-part
     48 	i += n - 1
     49 	if dec {
     50 		for j := 0; j < 2; j++ {
     51 			c := byte(price%10) + '0'
     52 			price /= 10
     53 			b[i] = c
     54 			i--
     55 		}
     56 		b[i] = decSeparator
     57 		i--
     58 	} else {
     59 		price /= 100
     60 	}
     61 
     62 	if price == 0 {
     63 		b[i] = '0'
     64 		return b
     65 	}
     66 
     67 	// print integer-part
     68 	j := 0
     69 	for price > 0 {
     70 		if j == 3 {
     71 			b[i] = milSeparator
     72 			i--
     73 			j = 0
     74 		}
     75 
     76 		c := byte(price%10) + '0'
     77 		price /= 10
     78 		b[i] = c
     79 		i--
     80 		j++
     81 	}
     82 	return b
     83 }