/// <summary> /// Парсирует строку в количество с заданной точностью. /// </summary> /// <param name="s">Парсируемая строка.</param> /// <param name="quantum">Квант (точность).</param> /// <returns></returns> /// <param name="res">Результат парсинга.</param> public static bool TryParse(string s, Amount quantum, out Amount res) { res = Amount.Empty; decimal d; if(Decimal.TryParse(s.AsNumeric(), out d) == false) return false; res = new Amount(d, quantum); return true; }
//------------------------------------------------------------------------------------- /// <summary> /// Парсирует строку в количество. /// </summary> /// <param name="s">Парсируемая строка.</param> /// <param name="res">Результат парсинга.</param> /// <returns></returns> public static bool TryParse(string s, out Amount res) { res = Amount.Empty; if(s == null) return false; decimal d; if(Decimal.TryParse(s.AsNumeric(), out d) == false) return false; res = new Amount(d); return true; }
/// <summary> /// Парсирует строку в количество с заданной точностью. /// </summary> /// <param name="s">Парсируемая строка.</param> /// <param name="quantum">Квант (точность).</param> /// <returns></returns> public static Amount Parse(string s, Amount quantum) { decimal d; if(Decimal.TryParse(s.AsNumeric(), out d) == false) throw new PulsarException("'{0}' не является вещественным числом!", s); return new Amount(d, quantum); }
/// <summary> /// Инициализирующий конструктор. /// </summary> /// <param name="val">Значение</param> /// <param name="quantum">Квант (точность)</param> public Amount(string val, Amount quantum) : this(Parse(val),quantum) { }
/// <summary> /// Инициализирующий конструктор. /// </summary> /// <param name="val">Значение</param> /// <param name="quantum">Квант (точность)</param> public Amount(Amount val, Amount quantum) : this((decimal)val,quantum) { }
/// <summary> /// Инициализирующий конструктор. /// </summary> /// <param name="val">Значение</param> /// <param name="quantum">Квант (точность)</param> public Amount(decimal val, Amount quantum) { m = 0; if(val < 0) throw new Exception("Количество не может быть отрицательным!"); if(val < 0.001m) return; if(val > ((decimal)(uint.MaxValue >> 2)) / quantum.Divisor) throw new Exception("Переполнение значения!"); uint res = (uint)(val * quantum.Divisor); // + ((uint)(val - (int)val) * 1000)/quantum.Divisor; Divisor = quantum.Divisor; // Усушка while(Divisor > 1) { if(res % 10 == 0) { res /= 10; Divisor /= 10; } else break; } if(res > (uint.MaxValue >> 2)) throw new Exception("Переполнение значения!"); m += (uint)(res << 2); }