我们在应用程序中有一个显示double值的文本框。此文本框连接到转换器,该转换器接收字符串,将其转换为double并将其舍入到2个小数位。然后,同一转换器将double转换回字符串并将其传递回视图。
现在我们面临的问题。问题是,四舍五入是按预期工作的,但是四舍五入不起作用。例如,如果我们在文本框中放置1.229,它会自动将其舍入到1.23,而如果我们将1.224放在它上面,则不会将其舍入到1.22
我更深入地研究了这个问题,发现实际的舍入工作正常,但是当舍入值传递给视图时,过程中似乎存在问题。 为了解释一下我的发现,如果我在Math.Round上设置一个断点,它返回的结果是预期的结果。但是当相同的值返回到视图时,由于某种原因,值会更改,并且文本框中显示的内容不是预期的值。
我将项目框架更改为4.5,发现.NET Framework 4.5中不存在此问题,一切都按预期工作。但我们正在使用.NET Framework 4.0并需要一种解决方法。
转换器代码:
public class TextToNumberConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string result = string.Empty;
int decimalsValue = 2;
if (parameter != null)
{
Int32.TryParse(parameter.ToString(), out decimalsValue);
}
if (!double.IsNaN(System.Convert.ToDouble(value)))
{
result = string.Format("{0}", Math.Round((double)value, decimalsValue, MidpointRounding.AwayFromZero));
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string inVal = (string)value;
switch (targetType.Name)
{
case "Int32":
return this.StringToInt32(inVal);
case "Double":
if (inVal != String.Empty &&
inVal != "-" &&
inVal != "-0" &&
inVal != "-0," &&
inVal != "-0." &&
inVal != "-0,0" &&
inVal != "-0.0")
{
return this.StringToDouble(inVal);
}
else
return Double.NaN;
default:
return 0;
}
}
private int StringToInt32(string inVal)
{
int retVal = 0;
// remove non-integer characters
//string regExpressionPattern = "[^0-9-]";
//inVal = Regex.Replace(inVal, regExpressionPattern, String.Empty);
bool result = Int32.TryParse(inVal, out retVal);
if (true == result)
{
return retVal;
}
else
{
return 0;
}
}
private double StringToDouble(string inVal)
{
double retVal = double.NaN;
// remove non-numeric characters
//string regExpressionPattern = "[^0-9-.,]";
//inVal = Regex.Replace(inVal, regExpressionPattern, String.Empty);
inVal = Regex.Replace(inVal, "[,]", CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator);
bool result = Double.TryParse(inVal, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out retVal);
if (true == result)
{
return retVal;
}
else
{
return double.NaN;
}
}
}
查看型号:
public class MainWindow_ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private RxData _currentRxData_right;
public RxData CurrentRxData_right
{
get
{
if (_currentRxData_right == null)
_currentRxData_right = new RxData();
return _currentRxData_right;
}
set
{
_currentRxData_right = value;
PropertyChanged(this, new PropertyChangedEventArgs("CurrentRxData_right"));
}
}
}
型号代码:
public class RxData
{
public double Sphere { get; set; }
}
数据输入的文本框:
<TextBox x:Name="txt_sph" Text="{Binding CurrentRxData_right.Sphere, Converter={StaticResource TextToNumber}, Mode=TwoWay, StringFormat=\{0:F2\}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, TargetNullValue=NULL}" ></TextBox>
答案 0 :(得分:0)
减少0.005的好老把手就可以完成这项工作: