Вы пытаетесь выполнить набор tls для порта, который не инкапсулирован в TLS. Если вы хотите использовать starttls
client, err := smtp.Dial("tcp", "smtp.office365.com:587")
if err != nil {
log.Panic(err)
}
err = client.StartTLS(tlsconfig)
if err != nil {
log.Panic(err)
}
Для этого может потребоваться рефакторинг:
private static string ToEngineeringNotation(this double d)
{
double exponent = Math.Log10(Math.Abs(d));
if (Math.Abs(d) >= 1)
{
switch ((int)Math.Floor(exponent))
{
case 0: case 1: case 2:
return d.ToString();
case 3: case 4: case 5:
return (d / 1e3).ToString() + "k";
case 6: case 7: case 8:
return (d / 1e6).ToString() + "M";
case 9: case 10: case 11:
return (d / 1e9).ToString() + "G";
case 12: case 13: case 14:
return (d / 1e12).ToString() + "T";
case 15: case 16: case 17:
return (d / 1e15).ToString() + "P";
case 18: case 19: case 20:
return (d / 1e18).ToString() + "E";
case 21: case 22: case 23:
return (d / 1e21).ToString() + "Z";
default:
return (d / 1e24).ToString() + "Y";
}
}
else if (Math.Abs(d) > 0)
{
switch ((int)Math.Floor(exponent))
{
case -1: case -2: case -3:
return (d * 1e3).ToString() + "m";
case -4: case -5: case -6:
return (d * 1e6).ToString() + "μ";
case -7: case -8: case -9:
return (d * 1e9).ToString() + "n";
case -10: case -11: case -12:
return (d * 1e12).ToString() + "p";
case -13: case -14: case -15:
return (d * 1e15).ToString() + "f";
case -16: case -17: case -18:
return (d * 1e15).ToString() + "a";
case -19: case -20: case -21:
return (d * 1e15).ToString() + "z";
default:
return (d * 1e15).ToString() + "y";
}
}
else
{
return "0";
}
}
Вот ссылка на некоторый код Ruby, который делает что-то похожее, хотя он форматируется как dddem, где показатель степени m всегда кратен 3.
Транслитерация на C #. Поскольку я не знаком с форматом, я не уверен, что это именно то, что вы хотите. Например, 0,0015 форматирует как 2e-3. Было бы достаточно тривиально заменить греческие буквы на показатель степени, используя оператор case и UTF-8 или другие кодировки. Упражнение оставлено на усмотрение читателя.
public static class FormatExtensions
{
public static string ToEngineering( this double value )
{
int exp = (int)(Math.Floor( Math.Log10( value ) / 3.0 ) * 3.0);
double newValue = value * Math.Pow(10.0,-exp);
if (newValue >= 1000.0) {
newValue = newValue / 1000.0;
exp = exp + 3;
}
return string.Format( "{0:##0}e{1}", newValue, exp);
}
}
Использование:
Console.WriteLine( ((double)15000).ToEngineering() );
double val = 15000;
Console.WriteLine( val.ToEngineering() );
Чтобы решить эту проблему, вам нужно создать класс (назовите его Engineering), который наследуется от Float, в котором вы переопределяете член ToString ().
Редактировать: Хорошо, теперь я понимаю проблему. Тем не менее, решение подклассов.
Вместо подклассов я бы использовал тот факт, что Double реализует IFormattable и напишет IFormatProvider, который форматирует число. Тогда у меня был бы код, который выглядит примерно так:
double d = 123.45;
Console.WriteLine(d.ToString(null, new MyCustomFormat()));