防止 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。我没有机会测试它,因为它需要您拥有的其他代码。如果有任何错误,请告诉我。