我正在构建一些自定义验证来验证一个小型LightSitch应用程序中的车辆识别号(VIN)。自定义验证在很大程度上非常简单,但我使用的代码类似于下面从Rusty在http://shapemetrics.wordpress.com/2010/08/23/vin-validation/的帖子中复制的代码。
public class VIN
{
//Make sure no instance of this class is created... only method is static.
private VIN() { }
public static bool IsValidVin(string p_strVin)
{
bool blnIsValid = false;
int intValue = 0;
int[] intWeights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 };
if (p_strVin == null)
{
return false;
}
else if (p_strVin.Length != 17)
{
return blnIsValid;
}
p_strVin = p_strVin.ToUpper().Trim();
int intCheckValue = 0;
char check = p_strVin[8];
char year = p_strVin[9];
if (!char.IsDigit(check) && check != 'X')
{
return blnIsValid;
}
else
{
if (check != 'X')
{
char[] d = new char[] { check };
intCheckValue = int.Parse(Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(d)));
}
else
{
intCheckValue = 10;
}
}
Hashtable replaceValues = new Hashtable();
replaceValues.Add('A', 1);
replaceValues.Add('B', 2);
replaceValues.Add('C', 3);
replaceValues.Add('D', 4);
replaceValues.Add('E', 5);
replaceValues.Add('F', 6);
replaceValues.Add('G', 7);
replaceValues.Add('H', 8);
replaceValues.Add('J', 1);
replaceValues.Add('K', 2);
replaceValues.Add('L', 3);
replaceValues.Add('M', 4);
replaceValues.Add('N', 5);
replaceValues.Add('P', 7);
replaceValues.Add('R', 9);
replaceValues.Add('S', 2);
replaceValues.Add('T', 3);
replaceValues.Add('U', 4);
replaceValues.Add('V', 5);
replaceValues.Add('W', 6);
replaceValues.Add('X', 7);
replaceValues.Add('Y', 8);
replaceValues.Add('Z', 9);
replaceValues.Add('1', 1);
replaceValues.Add('2', 2);
replaceValues.Add('3', 3);
replaceValues.Add('4', 4);
replaceValues.Add('5', 5);
replaceValues.Add('6', 6);
replaceValues.Add('7', 7);
replaceValues.Add('8', 8);
replaceValues.Add('9', 9);
replaceValues.Add('0', 0);
//Make sure it is a Valid Year
if (!replaceValues.Contains(year) && year != '0')
{
return blnIsValid;
}
//Make sure characters that are in the VIN are the ones allowed.
for (int i = 0; i < p_strVin.Length; i++)
{
if (!replaceValues.Contains(p_strVin[i]))
{
return false;
}
intValue += (intWeights[i] * ((int)replaceValues[p_strVin[i]]));
}
if ((intValue % 11) == intCheckValue)
{
blnIsValid = true;
}
return blnIsValid;
}
}我遇到的问题是Visual Studio告诉我"'System.Text.Encoding‘不包含’ASCII‘的定义“。它还指出找不到类型或命名空间"Hashtable“。
这些在LightSwitch项目中是不可用的吗?我得到了所有正确的using语句。我很困惑。
发布于 2012-12-05 11:10:41
由于Lightswitch是Silverlight应用程序,因此ascii编码不可用,因此建议您尝试使用Encoding.UTF8。
至于Hashtable,Silverlight也不支持它。另一种方法是使用Dictionary <Tkey, TValue>。See this link.
更新后的代码将如下所示(未经测试的代码):
bool blnIsValid = false;
int intValue = 0;
int[] intWeights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 };
if (p_strVin == null)
{
return false;
}
else if (p_strVin.Length != 17)
{
return blnIsValid;
}
p_strVin = p_strVin.ToUpper().Trim();
int intCheckValue = 0;
char check = p_strVin[8];
char year = p_strVin[9];
if (!char.IsDigit(check) && check != 'X')
{
return blnIsValid;
}
else
{
if (check != 'X')
{
char[] d = new char[] { check };
var bytes = Encoding.UTF8.GetBytes(d);
intCheckValue = int.Parse(Encoding.UTF8.GetString(bytes, 0, bytes.Length));
}
else
{
intCheckValue = 10;
}
}
Dictionary<char, int> replaceValues = new Dictionary<char, int>();
replaceValues.Add('A', 1);
replaceValues.Add('B', 2);
replaceValues.Add('C', 3);
replaceValues.Add('D', 4);
replaceValues.Add('E', 5);
replaceValues.Add('F', 6);
replaceValues.Add('G', 7);
replaceValues.Add('H', 8);
replaceValues.Add('J', 1);
replaceValues.Add('K', 2);
replaceValues.Add('L', 3);
replaceValues.Add('M', 4);
replaceValues.Add('N', 5);
replaceValues.Add('P', 7);
replaceValues.Add('R', 9);
replaceValues.Add('S', 2);
replaceValues.Add('T', 3);
replaceValues.Add('U', 4);
replaceValues.Add('V', 5);
replaceValues.Add('W', 6);
replaceValues.Add('X', 7);
replaceValues.Add('Y', 8);
replaceValues.Add('Z', 9);
replaceValues.Add('1', 1);
replaceValues.Add('2', 2);
replaceValues.Add('3', 3);
replaceValues.Add('4', 4);
replaceValues.Add('5', 5);
replaceValues.Add('6', 6);
replaceValues.Add('7', 7);
replaceValues.Add('8', 8);
replaceValues.Add('9', 9);
replaceValues.Add('0', 0);
//Make sure it is a Valid Year
if (!replaceValues.ContainsKey(year) && year != '0')
{
return blnIsValid;
}
//Make sure characters that are in the VIN are the ones allowed.
for (int i = 0; i < p_strVin.Length; i++)
{
if (!replaceValues.ContainsKey(p_strVin[i]))
{
return false;
}
intValue += (intWeights[i] * ((int)replaceValues[p_strVin[i]]));
}
if ((intValue % 11) == intCheckValue)
{
blnIsValid = true;
}
return blnIsValid;发布于 2012-12-12 02:02:54
您可能还想查看代码的更新版本。你有一个基本的布尔型答案。
取而代之的是网站上另一个反映更详细信息的网站:http://shapemetrics.wordpress.com/2011/12/05/vin-validate-improved
https://stackoverflow.com/questions/13713639
复制相似问题