我正在尝试创建一个可以在ok输入上处理和验证整数的方法。问题是我们的要求,无论选择何种语言,都将以下数字表示为ok输入:
1500, 1.500, 1,500, 1 500
-1500, -1.500, -1,500, -1 500
1500000, 1.500.500, 1,500,500 1 500 500
-1500000, -1.500.500, -1,500,500 -1 500 500
等等。
我的方法现在看起来像这样:
private bool TryParseInteger(string controlValue, out int controlInt)
{
int number;
NumberStyles styles = NumberStyles.Integer | NumberStyles.AllowThousands;
bool result = Int32.TryParse(controlValue, styles,
CultureInfo.InvariantCulture, out number);
controlInt = number;
return result;
}
这不符合我的要求。 1.500和1.500.500未被验证为正确的输入。
还有另一种方法可以解决这个问题吗?
感谢所有帮助。事实证明,1.500,50(依此类推)不应该通过验证,这使得建议的解决方案不起作用。还有其他想法吗?
答案 0 :(得分:3)
我认为这里的问题是每个国家/地区对1.500
的理解不同。例如,在美国,等于1的半,有一些无意义的零,在德国(如果记忆服务),它被理解为一千五百。
与此相协调,您应该在方法的开头添加一行,如下所示:
controlValue = new string(controlValue.Where(c => !char.IsPunctuation(c) && c != ' ' || c == '-'));
这将删除所有逗号,句号和空格,只要您只需要整数即可。如果你想获得小数,那么我们就有麻烦...
答案 1 :(得分:3)
只需更换所有这些标志!
此代码:
string[] arr = new[] { "1500", "1.500", "1,500", "1 500", "-1500", "-1.500", "-1,500", "-1 500",
"1500000", "1.500.500", "1,500,500","1 500 500",
"-1500000", "-1.500.500", "-1,500,500","-1 500 500"};
foreach (var s in arr)
{
int i = int.Parse(s.Replace(" ", "").Replace(",", "").Replace(".", ""));
Console.WriteLine(i);
}
产地:
1500
1500
1500
1500
-1500
-1500
-1500
-1500
1500000
1500500
1500500
1500500
-1500000
-1500500
-1500500
-1500500
答案 2 :(得分:2)
如果您不想与1,500.500
或1.500,500
匹配,可以将所有.
替换为,
,并尝试再次解析它。像这样:
private bool TryParseInteger(string controlValue, out int controlInt)
{
int number;
NumberStyles styles = NumberStyles.Integer | NumberStyles.AllowThousands;
bool result = Int32.TryParse(controlValue, styles,
CultureInfo.InvariantCulture, out number);
if (!result)
{
controlValue = controlValue.Replace('.', ',');
result = Int32.TryParse(controlValue, styles,
CultureInfo.InvariantCulture, out number);
}
controlInt = number;
return result;
}
答案 3 :(得分:0)
您可以创建自己的自定义文化,并根据需要更改NumberGroupSeparator
。
private static bool TryParseInteger(string controlValue, out int controlInt)
{
String[] groupSeparators = { ",", ".", " "};
CultureInfo customCulture = CultureInfo.InvariantCulture.Clone() as CultureInfo;
customCulture.NumberFormat.NumberDecimalSeparator = "SomeUnlikelyString";
NumberStyles styles = NumberStyles.Integer | NumberStyles.AllowThousands;
bool success = false;
controlInt = 0;
foreach (var separator in groupSeparators)
{
customCulture.NumberFormat.NumberGroupSeparator = separator;
success = Int32.TryParse(controlValue, styles, customCulture, out controlInt);
if (success)
{
break;
}
}
return success;
}