防止 C#(和 Blazor 服务器)中的双舍入?
Prevent double rounding in C# (and Blazor Server)?
这是我的第一个问题。
我有一个双精度数据类型的数值,它在 setter 中设置之前四舍五入小数。在号码的输入字段中,只允许输入 20 个字符(无逗号)。这在函数“CheckInput”中检查并返回布尔值。但是,由于数字在小数点后四舍五入,我无法正确检查字符数。有谁知道如何防止自动四舍五入吗?
这是我的替身属性:
[Required]
[StringLength(20, ErrorMessage = "Es sind max. 20 Zeichen erlaubt (ohne Komma).")]
private double _xValue;
public double XValue
{
get => _xValue;
set
{
var oldValue = value;
_xValue= value;
if (!CheckInput(InputField.XValue))
{
_xValue= oldValue;
}
}
}
这是检查我输入号码的功能:
public bool CheckInput(InputField inputField)
{
if (inputField == InputField.XValue || inputField == InputField.YValue)
{
var xWertDecimal = Convert.ToDecimal(XValue);
var yWertDecimal = Convert.ToDecimal(YWert);
var valueString = String.Empty;
if (inputField == InputField.XValue) valueString = xWertDecimal.ToString();
else if (inputField == InputField.YValue) valueString = yWertDecimal.ToString();
var splittedString = valueString.Split(',');
if (splittedString.Length == 2)
{
if (splittedString[0].Length + splittedString[1].Length > 20)
{
Snackbar.Add("Max. 20 Zeichen erlaubt!");
return false;
}
}
else if (splittedString.Length == 1)
{
if (splittedString[0].Length > 20)
{
Snackbar.Add("Max. 20 Zeichen erlaubt!");
return false;
}
}
return true;
}
else if (inputField == InputField.Haeufigkeit)
{
if (Haeufigkeit <= 0)
{
Snackbar.Add("Häufigkeit muss größer als 0 sein!");
return false;
}
return true;
}
else
{
return true;
}
}
无需将数字转换为 Decimal 即可获取字符串值。
您可以只使用 double 本身的 ToString()
方法,并检查那里的位数。
这里有一个解决方案 return double 的位数:
public static int GetDigitAmount(double numberToCheck)
{
// For more info on conversion see: https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=net-6.0
var strValue = numberToCheck.ToString("G", System.Globalization.CultureInfo.InvariantCulture);
return strValue.Length - (strValue.Contains(".") ? 1 : 0);
}
这里是您的代码的快速调整版本:
public bool CheckInput(InputField inputField)
{
if (inputField == InputField.XValue || inputField == InputField.YValue)
{
double? valueToCheck = null;
if (inputField == InputField.XValue) valueToCheck = XValue;
else if (inputField == InputField.YValue) valueToCheck = YWert;
if (valueToCheck != null && GetDigitAmount(valueToCheck.Value) > 20) {
Snackbar.Add("Max. 20 Zeichen erlaubt!");
return false;
}
return true;
}
else if (inputField == InputField.Haeufigkeit)
{
if (Haeufigkeit <= 0)
{
Snackbar.Add("Häufigkeit muss größer als 0 sein!");
return false;
}
return true;
}
else
{
return true;
}
}
public static int GetDigitAmount(double numberToCheck)
{
// For more info on conversion see: https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=net-6.0
var strValue = numberToCheck.ToString("G", System.Globalization.CultureInfo.InvariantCulture);
return strValue.Length - (strValue.Contains(".") ? 1 : 0);
}
P.S。我没有机会测试它,因为它需要您拥有的其他代码。如果有任何错误,请告诉我。
这是我的第一个问题。
我有一个双精度数据类型的数值,它在 setter 中设置之前四舍五入小数。在号码的输入字段中,只允许输入 20 个字符(无逗号)。这在函数“CheckInput”中检查并返回布尔值。但是,由于数字在小数点后四舍五入,我无法正确检查字符数。有谁知道如何防止自动四舍五入吗?
这是我的替身属性:
[Required]
[StringLength(20, ErrorMessage = "Es sind max. 20 Zeichen erlaubt (ohne Komma).")]
private double _xValue;
public double XValue
{
get => _xValue;
set
{
var oldValue = value;
_xValue= value;
if (!CheckInput(InputField.XValue))
{
_xValue= oldValue;
}
}
}
这是检查我输入号码的功能:
public bool CheckInput(InputField inputField)
{
if (inputField == InputField.XValue || inputField == InputField.YValue)
{
var xWertDecimal = Convert.ToDecimal(XValue);
var yWertDecimal = Convert.ToDecimal(YWert);
var valueString = String.Empty;
if (inputField == InputField.XValue) valueString = xWertDecimal.ToString();
else if (inputField == InputField.YValue) valueString = yWertDecimal.ToString();
var splittedString = valueString.Split(',');
if (splittedString.Length == 2)
{
if (splittedString[0].Length + splittedString[1].Length > 20)
{
Snackbar.Add("Max. 20 Zeichen erlaubt!");
return false;
}
}
else if (splittedString.Length == 1)
{
if (splittedString[0].Length > 20)
{
Snackbar.Add("Max. 20 Zeichen erlaubt!");
return false;
}
}
return true;
}
else if (inputField == InputField.Haeufigkeit)
{
if (Haeufigkeit <= 0)
{
Snackbar.Add("Häufigkeit muss größer als 0 sein!");
return false;
}
return true;
}
else
{
return true;
}
}
无需将数字转换为 Decimal 即可获取字符串值。
您可以只使用 double 本身的 ToString()
方法,并检查那里的位数。
这里有一个解决方案 return double 的位数:
public static int GetDigitAmount(double numberToCheck)
{
// For more info on conversion see: https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=net-6.0
var strValue = numberToCheck.ToString("G", System.Globalization.CultureInfo.InvariantCulture);
return strValue.Length - (strValue.Contains(".") ? 1 : 0);
}
这里是您的代码的快速调整版本:
public bool CheckInput(InputField inputField)
{
if (inputField == InputField.XValue || inputField == InputField.YValue)
{
double? valueToCheck = null;
if (inputField == InputField.XValue) valueToCheck = XValue;
else if (inputField == InputField.YValue) valueToCheck = YWert;
if (valueToCheck != null && GetDigitAmount(valueToCheck.Value) > 20) {
Snackbar.Add("Max. 20 Zeichen erlaubt!");
return false;
}
return true;
}
else if (inputField == InputField.Haeufigkeit)
{
if (Haeufigkeit <= 0)
{
Snackbar.Add("Häufigkeit muss größer als 0 sein!");
return false;
}
return true;
}
else
{
return true;
}
}
public static int GetDigitAmount(double numberToCheck)
{
// For more info on conversion see: https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=net-6.0
var strValue = numberToCheck.ToString("G", System.Globalization.CultureInfo.InvariantCulture);
return strValue.Length - (strValue.Contains(".") ? 1 : 0);
}
P.S。我没有机会测试它,因为它需要您拥有的其他代码。如果有任何错误,请告诉我。