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