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); }
/// <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)); }
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(""); }
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)); }
private Digit(DigitSign sign, int value) { this.Sign = sign; this.Value = value; }
private void GivenLimit(int limitDigitLength, DigitSign maxDigitSign) { _convertedResult = _number.ToLimitCredit(limitDigitLength, maxDigitSign); }
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); }
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()); }
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()); }
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)); }