как проверить, что плавающее число не равно "0" - PullRequest
2 голосов
/ 20 марта 2019

У меня есть элемент управления <Entry>, где пользователю разрешено вводить десятичные числа, например ...

0,2

0,02

5405

Но я не хочу вводить «0» (в виде десятичной дроби), как показано ниже

0,0

0,00

00,00

Элемент управления, используемый в моей Vista,

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

Как видно из моего Property Amount Уважаемый, у меня есть вызов метода setOnlyNumberDouble (), который дает пользователю возможность ввести одну запятую (","), я присоединяю следующий метод ...

 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 ()? любая помощь для меня?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Вы можете использовать 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 
  }
1 голос
/ 08 апреля 2019

Чтобы определить, равно ли значение числа с плавающей запятой в точности нулю или нет, просто используйте компаратор '==' для нуля и убедитесь, что тип в сравнительном выражении должен быть точно то же самое . как ниже:

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

Но код, указанный выше только , запустите ' do_something ', когда ' some_double ' равен , которому непосредственно присвоено точному номеру ноль, не то, что вам нужно .

Если ' some_double ' назначено результатом некоторых аргументов (например, преобразование строки в числовое значение с плавающей запятой), которое буквально должно быть равно нулю , код выше не будет работать, как мы думали , поскольку значение ' some_double ' не может быть точно равно нулю из-за точной потери числа с плавающей запятой .

На данном этапе мы не должны просто сравнивать плавающее значение с нулем, если плавающее значение было присвоено некоторыми вычислительными выражениями. Другой способ определить, равен ли он « * 035 *» нулю, - сравнить абсолютное значение числа с плавающей запятой с очень маленьким значением , которое можно считать ноль.

Для этой цели существует машинное эпсилон , значение float / double / long double ниже:

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

Но эти значения были слишком маленькими , что является точным наименьшим значением каждого типа чисел с плавающей запятой. Значения были не подходящими для использования сравнения числа, которое достаточно мало, чтобы считалось равным нулю , поскольку точная потеря чисел с плавающей запятой более значима чем эти значения эпсилон машины, см. ссылку ниже:

Арифметика с плавающей точкой и машинный эпсилон

Вы должны сами определить выделенное значение эпсилона в соответствии с вашим проектом.

Вы сравниваете введенный пользователем номер с нулем, и я видел MaxLength="5" в вашем XML. Ваше значение эпсилона должно быть 0,0001, так как оно меньше 0,001, что является минимальным ненулевым входным значением вашего <entry> элемента управления.

...