moneyx

package
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 4, 2026 License: Apache-2.0 Imports: 4 Imported by: 0

Documentation

Overview

Package moneyx 提供无状态、仅依赖标准库的元字符串与 int64 分金额转换,支持正数、负数和零。

YuanToCent 接受 ASCII 十进制整数或一至两位小数,允许一个前导负号及前导零; 例如 "12"、"12.3"、"-00012.34" 分别转换为 1200、1230、-1234 分。 拒绝空白、正号、科学计数法、千位分隔符、全角数字及多余小数位,不自动清理或舍入。 元金额范围为 "-92233720368547758.08" 至 "92233720368547758.07",对应 int64 的完整范围。 "-0"、"-0.00" 等负零输入均转换为 0;CentToYuan 将零输出为 "0.00"。 CentToYuan 始终输出固定两位小数;任意 int64 分金额往返转换不损失精度。

去除可选的前导负号后,错误依次按以下顺序判断,失败时分金额返回 0:

  • ErrInvalidFormat:整数部分为空,或存在小数点但其后部分为空、超过两个字节。
  • ErrInvalidCharacter:结构与长度检查通过后,整数或小数部分含非 ASCII 数字。
  • ErrOverflow:格式合法,但转换后的分金额超出 int64 范围。

调用方通过 errors.Is 判断错误并映射业务提示,不依赖错误文本。 本包不管理币种、汇率或业务金额上下限;是否允许负数、零金额等规则由应用判断。

以下示例需导入 fmt 和 github.com/bpcoder16/pixiu/moneyx:

cent, err := moneyx.YuanToCent("-12.30")
if err != nil {
    return err
}
fmt.Println(cent)                   // -1230
fmt.Println(moneyx.CentToYuan(cent)) // -12.30

Index

Examples

Constants

This section is empty.

Variables

View Source
var (
	// ErrInvalidFormat 表示去除可选负号后整数部分为空,或小数点后的部分不满足一至两个字节的长度要求。
	ErrInvalidFormat = errors.New("moneyx: invalid amount format")
	// ErrInvalidCharacter 表示结构检查通过后,整数或小数部分包含非 ASCII 数字字符。
	ErrInvalidCharacter = errors.New("moneyx: invalid amount character")
	// ErrOverflow 表示转换后的分金额超出 int64 范围。
	ErrOverflow = errors.New("moneyx: amount overflows int64 cents")
)

Functions

func CentToYuan

func CentToYuan(value int64) string

CentToYuan 将 int64 分金额转换为元字符串,固定保留两位小数,不损失精度,零输出为 "0.00"。

Example
package main

import (
	"fmt"

	"github.com/bpcoder16/pixiu/moneyx"
)

func main() {
	fmt.Println(moneyx.CentToYuan(1230))
	fmt.Println(moneyx.CentToYuan(1))
	fmt.Println(moneyx.CentToYuan(-1))
}
Output:
12.30
0.01
-0.01

func YuanToCent

func YuanToCent(value string) (int64, error)

YuanToCent 将元金额转换为 int64 分金额,接受整数或一至两位小数,允许前导负号和前导零。 不清理空白、不接受正号或科学计数法、不舍入;负零转换为 0,失败返回 0 和可用 errors.Is 判断的错误。 去除可选负号后,依次检查结构与小数部分长度、ASCII 数字字符、分金额范围。

Example
package main

import (
	"errors"
	"fmt"

	"github.com/bpcoder16/pixiu/moneyx"
)

func main() {
	cent, err := moneyx.YuanToCent("-12.30")
	fmt.Println(cent, err)

	_, err = moneyx.YuanToCent("92233720368547758.08")
	fmt.Println(errors.Is(err, moneyx.ErrOverflow))
}
Output:
-1230 <nil>
true

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL