我有一个<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>
控制的最小非零输入值。