The representation of how to use MVVM architecture the right way!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.8 KiB

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;
}
}
}