private static bool InternalTryParse(string s, out FixedPointDecimal result, bool truncateRange)
{
// Clean up string. Do quick null/empty test.
if(null != s)
{
s = s.Trim();
}
if(String.IsNullOrEmpty(s))
{
result = FixedPointDecimal.Null;
return false;
}
// Split string on optional decimal point.
string[] parts = s.Split('.');
if(parts.Length > 2)
{
result = FixedPointDecimal.Null;
return false;
}
// Test for negative sign.
bool isNegative;
if('-' == parts[0][0])
{
isNegative = true;
parts[0] = parts[0].Substring(1);
if(string.IsNullOrEmpty(parts[0]))
{
result = FixedPointDecimal.Null;
return false;
}
}
else
{
isNegative = false;
}
// Check fractional part is no longer than 6 digits.
if(parts.Length == 2 && parts[1].Length > 6)
{
if(truncateRange)
{
parts[1] = parts[1].Substring(0, 6);
}
else
{
result = FixedPointDecimal.Null;
return false;
}
}
// Join integer and fractional parts; paddign fractional part to 6 digits if necessary.
// Parse resulting significand string as integer.
string significandStr = parts[0] + (parts.Length == 2 ? parts[1].PadRight(6, '0') : "000000");
uint significand;
if(!uint.TryParse(significandStr, out significand))
{
result = FixedPointDecimal.Null;
return false;
}
// Test significand is within range of FixedPointDecimal.
if(significand > 1073741823u)
{
if(truncateRange)
{
significand = 1073741823u;
}
else
{
result = FixedPointDecimal.Null;
return false;
}
}
result = new FixedPointDecimal(significand, isNegative);
return true;
}