如何验证浮点数是否未"0"



我有一个<Entry>控制,允许用户输入十进制数字,用于考试...

0,2

0,02

5,405

,但我不想输入" 0"。(小数点),如下

0,0

0,00

00,00

我的远景中使用的控件是

myview.xaml:

 <Entry
          HorizontalOptions="FillAndExpand"    
          Placeholder="Cantidad"
          Keyboard="Numeric"
          MaxLength="5"
          Text="{Binding CantidadEstimado}"></Entry>

然后在我的ViewModel中以以下方式捕获字符串类型

ViewModel.cs:

    string cantidadEstimado;
   public string CantidadEstimado
        {
            get
            {
                return cantidadEstimado;
            }
            set
            {
                if (cantidadEstimado != value)
                {
                    cantidadEstimado = value.setOnlyNumbersDouble();
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CantidadEstimado)));
                }
            }
        }

如我的财产金额所示,亲爱的,我可以呼吁方法setonlynumberdouble(),该方法使用户有可能输入单个逗号(',,;&quort;&quort),我附上以下方法...

 public static string setOnlyNumbersDouble(this string s)
    {
        string sTemp = "";
        foreach (var item in s)
        {
            if (item == ',')
            {
                if (!sTemp.Contains(","))
                {
                    sTemp += item;
                }
            }
            else
            {
                sTemp += item; 
            }
        }
        return Regex.Replace(sTemp, @"[^0-9,]+", "");
    }

我如何验证用户未输入" 0"。小数点?我可以重复使用我的setonlynumberdouble()方法吗?对我有帮助吗?

您可以使用RegulareXpressions:

bool isZero = Regex.Matches(input,"[0,]");

bool isZero = int.Parse(input.Replace(",","") == 0;

而不是通过删除额外的逗号,非数字字符,而不是试图强迫它成为有效的双数字,而是...尝试验证它:

  public static bool IsValidDouble(this string s)
  {
      double d = 0;
      double.TryParse(s, out d);
      return d != 0; //will be false if result is 0 
      //return d > 0; if you don't want negativer values 
  }

确定浮点数数值是否完全等于零,只需使用'=='比较器至零,并确保 type 比较必须是完全相同的。如下:

double some_double = 0.0;
if (some_double == 0.0) do_something;

但是上面的代码唯一零,是不是您需要的

如果' some_double '由某些参数的分配(例如,将字符串转换为浮动点号值值)从字面上看>零,上面的代码无法正常工作,因为' some_double '的值不能完全零浮点号

在这一点上,如果某些计算表达式分配了浮动值,我们不应该仅将浮动值与零进行比较。确定它是否" "的另一种方法是比较浮动点编号的绝对值非常小的值被认为为零。

为此目的有机器Epsilons,float/double/long double的值如下:

 FLT_EPSILON = 1.192093e-07
 DBL_EPSILON = 2.220446e-16
LDBL_EPSILON = 1.084202e-19

但是这些值是太小,它是每个浮点数数字类型的精确值。值是不合适的,用于比较一个足够小的数字被视为零,因为浮点数的精确损失更重要比这些机器epsilon值,请参见下面的链接:

浮点算术和机器Epsilon

您应该根据需要定义专用的Epsilon价值。

您将用户输入号码比较为零,我在XML中看到了MaxLength="5"。您的epsilon值应为0.0001,因为它小于0.001,这是您的<entry>控制的最小非零输入值。

最新更新