diff options
Diffstat (limited to 'vendor/github.com/tdewolff/parse/v2/strconv/price.go')
| -rw-r--r-- | vendor/github.com/tdewolff/parse/v2/strconv/price.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/vendor/github.com/tdewolff/parse/v2/strconv/price.go b/vendor/github.com/tdewolff/parse/v2/strconv/price.go new file mode 100644 index 0000000..94b3834 --- /dev/null +++ b/vendor/github.com/tdewolff/parse/v2/strconv/price.go | |||
| @@ -0,0 +1,83 @@ | |||
| 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 | } | ||
