package trinary import ( "errors" "math/big" ) // ParseTrinary takes a trinary string and returns the // decimal value func ParseTrinary(in string) (int64, error) { return convertNumStringBase(in, int64(3)) } // convertNumStringBase takes a numeric string and the base of that string // and returns an int64 of the decimal representation func convertNumStringBase(in string, oldBase int64) (int64, error) { base := big.NewInt(oldBase) var sum big.Int for i := range in { x := big.NewInt(int64(in[i] - '0')) pow := big.NewInt(int64(len(in) - i - 1)) var n big.Int n.Exp(base, pow, nil) n.Mul(x, &n) sum.Add(&sum, &n) if sum.Int64() < 0 { return 0, errors.New("Integer Overflow") } } return sum.Int64(), nil }