Пример #1
0
        string GetStrDigitSign(DigitSign digitSign)//if(digitSign== DigitSign.E)  log.e("不存在的")
        {
            string str = "";

            switch (digitSign)
            {
            case DigitSign.K:
                str = "K";
                break;

            case DigitSign.M:
                str = "M";
                break;

            case DigitSign.G:
                str = "G";
                break;

            case DigitSign.T:
                str = "T";
                break;

            case DigitSign.P:
                str = "P";
                break;

            case DigitSign.E:
                str = "E";
                break;

            case DigitSign.Z:
                str = "Z";
                break;

            case DigitSign.Y:
                str = "Y";
                break;

            case DigitSign.B:
                str = "B";
                break;

            case DigitSign.N:
                str = "N";
                break;

            case DigitSign.D:
                str = "D";
                break;

            case DigitSign.None:
                str = "";
                break;

            default:
                str = "";
                break;
            }
            return(str);
        }
Пример #2
0
        /// <summary>
        ///   随机长整数
        /// </summary>
        public static long RandomLong(this Random self, DigitSign sign = DigitSign.All)
        {
            var bytes = new byte[8];

            self.NextBytes(bytes);
            if (sign == DigitSign.Positive)
            {
                bytes[0] = 0;                 //非负
            }
            else if (sign == DigitSign.Negative)
            {
                bytes[0] = 1;                 //非负
            }
            return(ByteUtil.ToLong(bytes));
        }
Пример #3
0
        public static string ToLimitCredit <T>(this T val, int limitDigitLength,
                                               DigitSign maxDigitSign = DigitSign.B) where T : struct
        {
            if (typeof(T) == typeof(int) || typeof(T) == typeof(long) || typeof(T) == typeof(double))
            {
                var limit          = Math.Pow(10, limitDigitLength);
                var convertedValue = Convert.ToInt64(val);

                return((convertedValue >= limit) ? convertedValue.ToShorterFloorNumber(limitDigitLength, maxDigitSign) : convertedValue.ToCredit());
            }

            // Debug.LogWarning(string.Format("This type {0} is not support for {1} extension method", typeof(T),
            //     System.Reflection.MethodBase.GetCurrentMethod()));

            return("");
        }
Пример #4
0
        public static Digit Parse(string digit, string str)
        {
            long value = 0;
            int  order = 0;

            for (int i = str.Length - 1; i >= 0; i--)
            {
                int v = Digit.DigitBinding[str[i]];

                value += (long)(Math.Pow(10, order) * v);

                order++;
            }

            if (value > int.MaxValue) // TODO check all boundaries conditions here. Now it's a bit buggy
            {
                throw new OverflowException("Input cant be fitted to Integer range");
            }

            DigitSign sign = Digit.SignBinding[digit];

            return(new Digit(sign, (int)value));
        }
Пример #5
0
 private Digit(DigitSign sign, int value)
 {
     this.Sign  = sign;
     this.Value = value;
 }
Пример #6
0
 private void GivenLimit(int limitDigitLength, DigitSign maxDigitSign)
 {
     _convertedResult = _number.ToLimitCredit(limitDigitLength, maxDigitSign);
 }
Пример #7
0
        DigitSign GetStrDigitSignType(string strSign)//if(digitSign== DigitSign.E)  log.e("不存在的")
        {
            DigitSign digitSign = DigitSign.None;

            switch (strSign)
            {
            case "K":
                digitSign = DigitSign.K;
                break;

            case "M":
                digitSign = DigitSign.M;
                break;

            case "G":
                digitSign = DigitSign.G;
                break;

            case "T":
                digitSign = DigitSign.T;
                break;

            case "P":
                digitSign = DigitSign.P;
                break;

            case "E":
                digitSign = DigitSign.E;
                break;

            case "Z":
                digitSign = DigitSign.Z;
                break;

            case "Y":
                digitSign = DigitSign.Y;
                break;

            case "B":
                digitSign = DigitSign.B;
                break;

            case "N":
                digitSign = DigitSign.N;
                break;

            case "D":
                digitSign = DigitSign.D;
                break;

            case "":
            case null:
                digitSign = DigitSign.None;
                break;

            default:
                Log.e("strSign = " + strSign);
                break;
            }
            return(digitSign);
        }
Пример #8
0
        public static string OldToShorterFloorNumber(this long val, int minDigitLength, DigitSign maxDigitSign, bool isOrderByAsc)
        {
            // minDigitLength = (int)maxDigitSign;

            var limit = Math.Pow(10, minDigitLength); // ex: 10^6

            if (val >= limit)
            {
                // 根據 maxDigitSign 的限制,  Convert to K, B, M 縮寫 => Math.Pow(10, (int)Math.Pow(10, minDigitLength)).ToCredit();
            }
            else
            {
                // return val.ToCredit();
            }

            var maxDigitLength = (int)maxDigitSign;

            var digitFormatMapping = new List <DigitFormat>()
            {
                new DigitFormat()
                {
                    Limit = Math.Pow(10, minDigitLength + 6), Value = Math.Pow(10, (int)DigitSign.B), Sign = DigitSign.B
                },
                new DigitFormat()
                {
                    Limit = Math.Pow(10, minDigitLength + 3), Value = Math.Pow(10, (int)DigitSign.M), Sign = DigitSign.M
                },
                new DigitFormat()
                {
                    Limit = Math.Pow(10, minDigitLength), Value = Math.Pow(10, (int)DigitSign.K), Sign = DigitSign.K
                },
            };

            foreach (var digitFormat in digitFormatMapping.Where(x => (int)x.Sign <= (int)maxDigitSign).OrderBy(x => isOrderByAsc ? x.Limit : 0))
            // foreach (var digitFormat in digitFormatMapping.OrderBy(x => isOrderByAsc ? x.Limit : 0))
            {
                if (val >= digitFormat.Limit)
                {
                    return(string.Format("{0}{1}", (val / (long)digitFormat.Value).ToCredit(), digitFormat.Sign));
                }
            }

            return(val.ToCredit());
        }
Пример #9
0
        private static string ToShorterFloorNumber(this long val, int limitDigitLength, DigitSign maxDigitSign)
        {
            var valueLength = val.ToString().Length;

            var digitMappings = new List <DigitMapping>()
            {
                new DigitMapping()
                {
                    Sign = DigitSign.B
                },
                new DigitMapping()
                {
                    Sign = DigitSign.M
                },
                new DigitMapping()
                {
                    Sign = DigitSign.K
                }
            };

            var firstStepDigitMapping = digitMappings.Where(x =>
            {
                var lengthLowerThanMaxDigitSign = x.DigitLength <= (int)maxDigitSign;
                return((valueLength - x.DigitLength) <= limitDigitLength && lengthLowerThanMaxDigitSign);
            }).Select(x => x);

            if (!firstStepDigitMapping.Any())
            {
                var divisor = (long)Math.Pow(10, (int)maxDigitSign);
                return(string.Format("{0}{1}", (val / divisor).ToCredit(), maxDigitSign));
            }

            var finalStepDigitMapping = firstStepDigitMapping.Aggregate((biggerDigitMapping, smallerDigitMapping) => (biggerDigitMapping.DigitLength > smallerDigitMapping.DigitLength ? smallerDigitMapping : null));;

            if (finalStepDigitMapping != null)
            {
                return(string.Format("{0}{1}", (val / (long)Math.Pow(10, finalStepDigitMapping.DigitLength)).ToCredit(), finalStepDigitMapping.Sign));
            }
            else
            {
                return(val.ToCredit());
            }

            // old code
            var digitFormatList = new List <DigitFormat>()
            {
                new DigitFormat()
                {
                    Limit = Math.Pow(10, limitDigitLength + 6), Value = Math.Pow(10, (int)DigitSign.B), Sign = DigitSign.B
                },
                new DigitFormat()
                {
                    Limit = Math.Pow(10, limitDigitLength + 3), Value = Math.Pow(10, (int)DigitSign.M), Sign = DigitSign.M
                },
                new DigitFormat()
                {
                    Limit = Math.Pow(10, limitDigitLength), Value = Math.Pow(10, (int)DigitSign.K), Sign = DigitSign.K
                },
            };

            foreach (var digitFormat in GetLowerOrEqualThanMaxDigitFormatList(maxDigitSign, false, digitFormatList))
            {
                if (limitDigitLength >= (int)digitFormat.Sign)
                {
                    if (val >= digitFormat.Limit && val >= digitFormat.Value)
                    {
                        return(string.Format("{0}{1}", (val / (long)digitFormat.Value).ToCredit(), digitFormat.Sign));
                    }
                }
            }

            return(val.ToCredit());
        }
Пример #10
0
 private static IOrderedEnumerable <DigitFormat> GetLowerOrEqualThanMaxDigitFormatList(DigitSign maxDigitSign, bool isOrderByAsc, List <DigitFormat> digitFormatList)
 {
     return(digitFormatList.Where(x => (int)x.Sign <= (int)maxDigitSign).OrderBy(x => isOrderByAsc ? x.Value : 0));
 }