39 public static string RandomString(
int minLength,
int maxLength, Random randomGenerator =
null)
50 const string allowedChars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.";
51 randomGenerator = randomGenerator ??
new Random();
54 int randomLength = randomGenerator.Next(minLength, maxLength + 1);
55 random =
new string(Enumerable.Repeat(allowedChars, randomLength)
56 .Select(s => s[randomGenerator.Next(s.Length)]).ToArray()).Trim();
57 }
while (random.Length < minLength);
79 if (Double.IsPositiveInfinity(d))
81 if (Double.IsNegativeInfinity(d))
87 long bits = BitConverter.DoubleToInt64Bits(d);
89 bool negative = (bits < 0);
90 int exponent = (int)((bits >> 52) & 0x7ffL);
91 long mantissa = bits & 0xfffffffffffffL;
103 mantissa = mantissa | (1L << 52);
117 while ((mantissa & 1) == 0)
124 ArbitraryDecimal ad =
new ArbitraryDecimal(mantissa);
131 for (
int i = 0; i < -exponent; i++)
138 for (
int i = 0; i < exponent; i++)
144 return "-" + ad.ToString();
146 return ad.ToString();
150 private class ArbitraryDecimal
153 private byte[] _digits;
157 private int _decimalPoint = 0;
163 internal ArbitraryDecimal(
long x)
165 string tmp = x.ToString(CultureInfo.InvariantCulture);
166 _digits =
new byte[tmp.Length];
167 for (
int i = 0; i < tmp.Length; i++)
168 _digits[i] = (
byte)(tmp[i] -
'0');
176 internal void MultiplyBy(
int amount)
178 byte[] result =
new byte[_digits.Length + 1];
179 for (
int i = _digits.Length - 1; i >= 0; i--)
181 int resultDigit = _digits[i] * amount + result[i + 1];
182 result[i] = (byte)(resultDigit / 10);
183 result[i + 1] = (byte)(resultDigit % 10);
191 Array.Copy(result, 1, _digits, 0, _digits.Length);
202 internal void Shift(
int amount)
204 _decimalPoint += amount;
210 private void Normalize()
213 for (first = 0; first < _digits.Length; first++)
214 if (_digits[first] != 0)
217 for (last = _digits.Length - 1; last >= 0; last--)
218 if (_digits[last] != 0)
221 if (first == 0 && last == _digits.Length - 1)
224 byte[] tmp =
new byte[last - first + 1];
225 for (
int i = 0; i < tmp.Length; i++)
226 tmp[i] = _digits[i + first];
228 _decimalPoint -= _digits.Length - (last + 1);
235 public override string ToString()
237 char[] digitString =
new char[_digits.Length];
238 for (
int i = 0; i < _digits.Length; i++)
239 digitString[i] = (
char)(_digits[i] +
'0');
243 if (_decimalPoint == 0)
245 return new string(digitString);
250 if (_decimalPoint < 0)
252 return new string(digitString) +
253 new string(
'0', -_decimalPoint);
257 if (_decimalPoint >= digitString.Length)
260 new string(
'0', (_decimalPoint - digitString.Length)) +
261 new string(digitString);
267 return new string(digitString, 0,
268 digitString.Length - _decimalPoint) +
270 new string(digitString,
271 digitString.Length - _decimalPoint,