|
@@ -53,3 +53,55 @@ func normalizeAmount(amount string) string {
|
|
func MoneyNormalize(s string) string {
|
|
func MoneyNormalize(s string) string {
|
|
return strings.ReplaceAll(s, ",", "")
|
|
return strings.ReplaceAll(s, ",", "")
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+// 金额字符串求和,要求金额字符串必须是整数且保留两位小数。
|
|
|
|
+func MoneyAdd(a, b string) string {
|
|
|
|
+ // n = max(len(a), len(b))
|
|
|
|
+ var n int
|
|
|
|
+ if len(a) > len(b) {
|
|
|
|
+ n = len(a)
|
|
|
|
+ } else {
|
|
|
|
+ n = len(b)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 倒序求和
|
|
|
|
+ // 123.45
|
|
|
|
+ // + 67.89
|
|
|
|
+ // --------
|
|
|
|
+ // _191.34
|
|
|
|
+ bs := make([]byte, n+1) // 可能有进位
|
|
|
|
+ var carry byte
|
|
|
|
+ for i := 1; i <= n; i++ {
|
|
|
|
+ // 小数点
|
|
|
|
+ if i == 3 {
|
|
|
|
+ bs[n-i+1] = '.'
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 和 算数值
|
|
|
|
+ c := byteOf(a, i) + byteOf(b, i) + carry
|
|
|
|
+ if c >= 10 {
|
|
|
|
+ carry = 1
|
|
|
|
+ c -= 10
|
|
|
|
+ } else {
|
|
|
|
+ carry = 0
|
|
|
|
+ }
|
|
|
|
+ bs[n-i+1] = c + '0'
|
|
|
|
+ }
|
|
|
|
+ if carry != 0 {
|
|
|
|
+ bs[0] = '1'
|
|
|
|
+ return string(bs)
|
|
|
|
+ }
|
|
|
|
+ return string(bs[1:])
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 倒取字符串对应位算数值,超长取 0。
|
|
|
|
+//
|
|
|
|
+// byteOf("123.45", 1) -> 5
|
|
|
|
+// byteOf("67.89", 5) -> 0
|
|
|
|
+func byteOf(s string, i int) byte {
|
|
|
|
+ if len(s) < i {
|
|
|
|
+ return 0
|
|
|
|
+ }
|
|
|
|
+ return s[len(s)-i] - '0'
|
|
|
|
+}
|