using System; using System.Globalization; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Data; namespace SignalsMVVM.UI.Converters { [ValueConversion(typeof(double), typeof(string))] public class HertzConverter : IValueConverter { static string[] keys = new string[] { "Гц", "кГц", "МГц", "ГГц" }; static string[] keys_lower = keys.Select(k => k.ToLower()).ToArray(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) //double->string { double _value = (double)value; int pow_count = 0; while (_value >= 1000) { _value = _value / 1000; pow_count++; } return _value.ToString() + " " + keys[pow_count]; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) //string->double { #region old_code /*if (_value >= 500 * 1e9) { result = _value / 1e9; return (result.ToString() + " гГц"); } else if (_value >= 1e6 & _value < 500 * 1e9) { result = _value / 1e6; return (result.ToString() + " мГц"); } else if (_value >= 1e3 & _value < 1e6) { result = _value / 1e3; return (result.ToString(CultureInfo.InvariantCulture) + " кГц"); } else { return (_value).ToString() + " Гц"; }*/ /*double result; if (Double.TryParse(value.ToString(), System.Globalization.NumberStyles.Any, culture, out result)) { return result; } else if (Double.TryParse(value.ToString().Replace(" Гц", ""), System.Globalization.NumberStyles.Any, culture, out result)) { return result; } else if (Double.TryParse(value.ToString().Replace(" МГц", ""), System.Globalization.NumberStyles.Any, culture, out result)) { return result; } else if (Double.TryParse(value.ToString().Replace(" ГГц", ""), System.Globalization.NumberStyles.Any, culture, out result)) { return result; } else if (Double.TryParse(value.ToString().Replace(" КГц", ""), System.Globalization.NumberStyles.Any, culture, out result)) { return result; }*/ #endregion string s = (string)value; Regex regex = new Regex(@"^\s*([0-9]+\.?[0-9]+)\s*([a-zA-Zа-яА-Я]+)?\s*$"); if (!string.IsNullOrEmpty(s)) { Match match = regex.Match(s); var groups = match.Success ? match.Groups : null; double savedValue = 0; if (groups != null) { Group doublePart = groups[1]; Group stringPart = groups[2]; int index = 0; if (!string.IsNullOrEmpty(stringPart.Value)) { if (keys.Contains(stringPart.Value.ToLower())) index = Array.IndexOf(keys, stringPart.Value.ToLower()); else return 0; } savedValue = Math.Pow(1000, index) * System.Convert.ToDouble(doublePart.Value, CultureInfo.InvariantCulture); savedValue = (savedValue > 500 * 1e9) ? 500 * 1e9 : savedValue; return savedValue; } } return value; } } }