private static void TryMinifyNumberWithUnit(NumberWithUnitValue value, ReadOnlyDictionary<Unit, decimal> possibleConversions, ref NumberWithUnitValue smallest)
{
if (!possibleConversions.ContainsKey(value.Unit)) return;
var min = MinifyNumberValue(value);
var ret = new NumberWithUnitValue(min.Value, value.Unit);
string retStr;
using (var buffer = new StringWriter())
{
ret.Write(buffer);
retStr = buffer.ToString();
}
var inBasic = min.Value * possibleConversions[value.Unit];
foreach (var unit in possibleConversions.Keys)
{
var conversion = possibleConversions[unit];
var maxPrecision = inBasic / conversion;
// 5 decimal points seems like an acceptable level of precision; webkit seems to agree
var inUnit = decimal.Round(maxPrecision, 5);
var asNum = new NumberValue(inUnit);
var minified = MinifyNumberValue(asNum);
var newMin = new NumberWithUnitValue(minified.Value, unit);
string newMinStr;
using (var buffer = new StringWriter())
{
newMin.Write(buffer);
newMinStr = buffer.ToString();
}
if (newMinStr.Length < retStr.Length)
{
ret = newMin;
retStr = newMinStr;
}
}
smallest = ret;
}