驗証碼計算方式
將字母轉換成二位數然後 sum= 十位數+個位數*9
後面 7 碼分別乘上 8,7,6,….1, 相加後再與sum相加
驗証碼即為 10-(sum%10), 但若結果為10, 則驗証碥為0
|
出生縣市 英文代號 檢驗數字 |
台北市
A 10 |
台中市
B 11 |
基隆市
C 12 |
台南市
D 13 |
高雄市
E 14 |
台北縣
F 15 |
| 出生縣市
英文代號 檢驗數字 |
宜蘭縣
G 16 |
桃園縣
H 17 |
嘉義市
I 34 |
新竹縣
J 18 |
苗栗縣
K 19 |
台中縣
L 20 |
| 出生縣市
英文代號 檢驗數字 |
南投縣
M 21 |
彰化縣
N 22 |
新竹市
O 35 |
雲林縣
P 23 |
嘉義縣
Q 24 |
台南縣
R 25 |
| 出生縣市
英文代號 檢驗數字 |
高雄縣
S 26 |
屏東縣
T 27 |
花蓮縣
U 28 |
台東縣
V 29 |
金門縣
W 30 |
澎湖縣
X 31 |
| 出生縣市
英文代號 檢驗數字 |
陽明山
Y 32 |
連江縣
Z 33 |
||||
身份証驗証碼 A 1 2 3 4 5 6 7 8 9 10 8 7 6 5 4 3 2 1 1+0*9 8 14 18 20 20 18 14 8 = 121 121 % 10 =1 10-1 = 9
完整代碼如下
using System;
using System.Windows;
namespace TaiwanId
{
public partial class MainWindow : Window
{
string[] city = {
"臺北市","臺中市","基隆市","臺南市","高雄市","臺北縣","宜蘭縣",
"桃園縣","嘉義市","新竹縣","苗栗縣","臺中縣","南投縣","彰化縣",
"新竹市","雲林縣","嘉義縣","臺南縣","高雄縣","屏東縣","花蓮縣",
"臺東縣","金門縣","澎湖縣","陽明山","連江縣" };
int[] code = {
10,11,12,13,14,15,16,
17,34,18,19,20,21,22,
35,23,24,25,26,27,28,
29,30,31,32,33};
string[] alias = {
"A","B","C","D","E","F","G",
"H","I","J","K","L","M","N",
"O","P","Q","R","S","T","U",
"V","W","X","Y","Z"};
public MainWindow()
{
InitializeComponent();
foreach(string s in city)
{
cmbCity.Items.Add(s);
}
cmbSex.Items.Add("男");
cmbSex.Items.Add("女");
cmbCity.SelectedIndex = 0;
cmbSex.SelectedIndex = 0;
}
private void btnNew_Click(object sender, RoutedEventArgs e)
{
Random r = new Random();
string id = "";
id += alias[cmbCity.SelectedIndex];
if (cmbSex.SelectedIndex == 0) id += "1";
else id += "2";
for (int i = 0; i < 7; i++)
{
id += r.Next(0, 10);
}
//txtId.Text = id;
txtId.Text = id + checksum(id);
}
private void btnCheck_Click(object sender, RoutedEventArgs e)
{
lblChecksum.Content=checksum(txtId2.Text).ToString();
}
private int checksum(string id)
{
int sum = 0;
if (id.Length != 9)
{
MessageBox.Show("長度必需為 9 位數");
return -1;
}
char t = id.Substring(0, 1).ToUpper().ToCharArray()[0];
if (t < 65 || t > 90)
{
MessageBox.Show("第一碼必需為英文字母");
return -1;
}
//英文字母轉成2位數字後, 十位數加上個位數*9
int c = code[t - 65];
sum = c / 10 + (c % 10) * 9;
for (int i = 1; i <= 8; i++)
{
int x = Int32.Parse(id.Substring(i, 1));
sum += x * (9 - i);
}
return (10 - sum % 10) % 10;
}
}
}
xaml 檔如下
<Window x:Class="TaiwanId.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TaiwanId" mc:Ignorable="d" Title="MainWindow" Height="450" Width="860"> <Grid> <Grid.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF8DFFFA" Offset="0"/> <GradientStop Color="#FFEBABEE" Offset="1"/> </LinearGradientBrush> </Grid.Background> <StackPanel Orientation="Vertical"> <StackPanel Orientation="Vertical"> <StackPanel.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFF6FF3E" Offset="0"/> <GradientStop Color="#FF37C6FB" Offset="1"/> </LinearGradientBrush> </StackPanel.Background> <Label Content="台灣身份証字號產生器" HorizontalAlignment="Center" FontSize="24"/> </StackPanel> <StackPanel Orientation="Horizontal" Margin="0,20,0,0"> <Label Content="縣市" FontSize="24" VerticalContentAlignment="Center"/> <ComboBox x:Name="cmbCity" Width="100" FontSize="24" VerticalContentAlignment="Center"/> <Label Content="性別 " Margin="20,0,0,0" FontSize="24" VerticalContentAlignment="Center"/> <ComboBox x:Name="cmbSex" Width="100" FontSize="24" VerticalContentAlignment="Center"/> <Button Content="產生" x:Name="btnNew" Click="btnNew_Click" Margin="20,0,0,0" FontSize="24" Width="100"/> <Label Content="新身份証字號" FontSize="24" Margin="20,0,0,0" VerticalContentAlignment="Center"/> <TextBox x:Name="txtId" Width="200" Height="50" Background="#FF9CF120" FontSize="24" IsReadOnly="True" VerticalContentAlignment="Center" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="0,20,0,0"> <StackPanel.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF14E7F1" Offset="0"/> <GradientStop Color="#FFB5B8F9" Offset="1"/> </LinearGradientBrush> </StackPanel.Background> <Label Content="身份証前九碼" FontSize="24" VerticalContentAlignment="Center"/> <TextBox x:Name="txtId2" Width="200" FontSize="24" VerticalContentAlignment="Center"/> <Label x:Name="lblChecksum" Width="50" FontSize="24" Background="#FFD1D1D1" VerticalContentAlignment="Center"/> <Button x:Name="btnCheck" Content="檢碼" Height="50" Width="100" FontSize="24" Margin="20,0,0,0" Click="btnCheck_Click" VerticalContentAlignment="Center"/> </StackPanel> </StackPanel> </Grid> </Window>

