/// /// Copyright (c) 2017-2018 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Linq; using System.Text; using Common; namespace Config { public static class Utils { public static string SignificantDigitsToFmt(double value, int sigDigits) { if (sigDigits == 6) { if (value >= 99999.5 || value < -99999.5) return "F0"; else if (value >= 9999.95 || value < -9999.95) return "F1"; else if (value >= 999.995 || value < -999.995) return "F2"; else if (value >= 99.9995 || value < -99.9995) return "F3"; else if (value >= 9.99995 || value < -9.99995) return "F4"; else if (value >= 0.999995 || value < -0.999995) return "F5"; else if (value >= 0.0999995 || value < -0.0999995) return "F6"; else if (value >= 0.00999995 || value < -0.00999995) return "F7"; else if (value >= 0.000999995 || value < -0.000999995) return "F8"; else if (value >= 0.0000999995 || value < -0.0000999995) return "F9"; else return "F10"; } else if (sigDigits == 5) { if (value >= 9999.5 || value < -9999.5) return "F0"; else if (value >= 999.95 || value < -999.95) return "F1"; else if (value >= 99.995 || value < -99.995) return "F2"; else if (value >= 9.9995 || value < -9.9995) return "F3"; else if (value >= 0.99995 || value < -0.99995) return "F4"; else if (value >= 0.099995 || value < -0.099995) return "F5"; else if (value >= 0.0099995 || value < -0.0099995) return "F6"; else if (value >= 0.00099995 || value < -0.00099995) return "F7"; else if (value >= 0.000099995 || value < -0.000099995) return "F8"; else return "F9"; } else if (sigDigits == 4) { if (value >= 999.5 || value < -999.5) return "F0"; else if (value >= 99.95 || value < -99.95) return "F1"; else if (value >= 9.995 || value < -9.995) return "F2"; else if (value >= 0.9995 || value < -0.9995) return "F3"; else if (value >= 0.09995 || value < -0.09995) return "F4"; else if (value >= 0.009995 || value < -0.009995) return "F5"; else if (value >= 0.0009995 || value < -0.0009995) return "F6"; else if (value >= 0.00009995 || value < -0.00009995) return "F7"; else return "F8"; } else if (sigDigits == 3) { if (value >= 99.5 || value < -99.5) return "F0"; else if (value >= 9.95 || value < -9.95) return "F1"; else if (value >= 0.995 || value < -0.995) return "F2"; else if (value >= 0.0995 || value < -0.0995) return "F3"; else if (value >= 0.00995 || value < -0.00995) return "F4"; else if (value >= 0.000995 || value < -0.000995) return "F5"; else if (value >= 0.0000995 || value < -0.0000995) return "F6"; else return "F7"; } else if (sigDigits == 2) { if (value >= 9.5 || value < -9.5) return "F0"; else if (value >= 0.95 || value < -0.95) return "F1"; else if (value >= 0.095 || value < -0.095) return "F2"; else if (value >= 0.0095 || value < -0.0095) return "F3"; else if (value >= 0.00095 || value < -0.00095) return "F4"; else if (value >= 0.000095 || value < -0.000095) return "F5"; else return "F6"; } else /// if (sigDigits == 1) { if (value >= 0.95 || value < -0.95) return "F0"; else if (value >= 0.095 || value < -0.095) return "F1"; else if (value >= 0.0095 || value < -0.0095) return "F2"; else if (value >= 0.00095 || value < -0.00095) return "F3"; else if (value >= 0.000095 || value < -0.000095) return "F4"; else return "F5"; } } /// /// Extract and return a DB server from a MySQL connection string. /// public static string GetDBServer(string connectionString) { return GetFromConnectionString(connectionString, new string[] { "SERVER=" }); } /// /// Extract and return a DB name from a MySQL connection string. /// public static string GetDBName(string connectionString) { return GetFromConnectionString(connectionString, new string[] { "DATABASE=" }); } /// /// Extract and return a username from a MySQL connection string /// public static string GetDBUser(string connectionString) { return GetFromConnectionString(connectionString, new string[] { "USER=", "UID=" }); } /// /// Extract and return a password from a MySQL connection string /// public static string GetDBPassword(string connectionString) { return GetFromConnectionString(connectionString, new string[] { "PASSWORD=", "PWD=" }); } /// /// Extract and return an element of a MySQL connection string /// (a host, a database, a user name or a password). /// Return an empty string on any error. /// public static string GetFromConnectionString(string connectionString, string[] patterns) { foreach (var pattern in patterns) { int startIx = connectionString.IndexOf(pattern); if (startIx >= 0) { /// pattern found, extract the subsequent element startIx += pattern.Length; int endIx = connectionString.IndexOf(';', startIx); return (endIx > 0) ? connectionString.Substring(startIx, endIx - startIx) : string.Empty; } } /// pattern NOT found return string.Empty; } /// /// Get either Q1 or Qmin flow for a given Qn and metrological class /// /// Nominal flow in m3/h /// Metrological class ("A" ,"B", "C" or "R#") /// NotSpecified, ColdWater or HotWater /// Default flow when metrologic does not match pattern /// Q1 or Qmin flow in m3/h public static double GetQ1Qmin(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) { if (string.IsNullOrEmpty(metroClass)) return Qdflt; int metroClassRatio; if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0)) { return Qn / (double)metroClassRatio; } else { if (medium == Medium.HotWater) { switch (metroClass) { case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn); case "B": return (Qn < 15) ? (0.02 * Qn) : (0.04 * Qn); case "C": return (Qn < 15) ? (0.01 * Qn) : (0.02 * Qn); case "D": return (Qn < 15) ? (0.01 * Qn) : Qdflt; default: break; } } else { switch (metroClass) { case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn); case "B": return (Qn < 15) ? (0.02 * Qn) : (0.03 * Qn); case "C": return (Qn < 15) ? (0.01 * Qn) : (0.006 * Qn); default: break; } } } return Qdflt; } /// /// Get either Q2 or Qt flow for a given Qn and metrological class /// /// Nominal flow in m3/h /// Metrological class ("A" ,"B", "C" or "R#") /// NotSpecified, ColdWater or HotWater /// Default flow when metrologic does not match pattern /// Q2 or Qt flow in m3/h public static double GetQ2Qt(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) { if (string.IsNullOrEmpty(metroClass)) return Qdflt; int metroClassRatio; if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0)) { return 1.6 * Qn / (double)metroClassRatio; } if (medium == Medium.HotWater) { switch (metroClass) { case "A": return (Qn < 15) ? (0.1 * Qn) : (0.2 * Qn); case "B": return (Qn < 15) ? (0.08 * Qn) : (0.15 * Qn); case "C": return (Qn < 15) ? (0.06 * Qn) : (0.1 * Qn); case "D": return (Qn < 15) ? (0.015 * Qn) : Qdflt; default: break; } } else { switch (metroClass) { case "A": return (Qn < 15) ? (0.1 * Qn) : (0.3 * Qn); case "B": return (Qn < 15) ? (0.08 * Qn) : (0.2 * Qn); case "C": return (Qn < 15) ? (0.015 * Qn) : (0.015 * Qn); default: break; } } return Qdflt; } /// /// Get either Q4 or Qmax flow for a given Qn and metrological class /// /// Nominal flow in m3/h /// Metrological class ("A" ,"B", "C" or "R#") /// NotSpecified, ColdWater or HotWater /// Default flow when metrologic does not match pattern /// Q4 or Qmax flow in m3/h public static double GetQ4Qmax(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) { if (string.IsNullOrEmpty(metroClass)) return Qdflt; switch (metroClass[0]) { case 'A': case 'B': case 'C': case 'D': return 2 * Qn; case 'R': return 1.25 * Qn; default: return Qdflt; } } } }