在 PLSQL 中检查瑞士工资单的数字
Check Digit for Swiss Pay Slips in PLSQL
我对瑞士工资单的 Luhn 算法有疑问。我在 C、Phyton 或 Java 脚本中找到了一个算法,但我不知道如何在 Oracle 上实现这个算法。
http://dnando.github.io/blog/2014/09/23/check-digit-computation-swiss-pay-slips/
http://www.hosang.ch/modulo10.aspx
此页面展示了算法的样子。
public static int modulo10(string nummer)
{
// 'nummer' darf nur Ziffern zwischen 0 und 9 enthalten!
int[] tabelle = { 0, 9, 4, 6, 8, 2, 7, 1, 3, 5 };
int uebertrag = 0;
foreach (char ziffer in nummer)
uebertrag = tabelle[(uebertrag + ziffer - '0') % 10];
return (10 - uebertrag) % 10;
}
你知道如何在 PLSQL 中实现 table 吗?
在此先感谢您对此算法的帮助。
您可以使用:
CREATE FUNCTION luhn_modulo(
value IN VARCHAR2
) RETURN NUMBER DETERMINISTIC
IS
offsets CONSTANT CHAR(10) := '0946827135';
output PLS_INTEGER := 0;
BEGIN
FOR i IN 1 .. LENGTH( value ) LOOP
output := SUBSTR( offsets, MOD(output + SUBSTR( value, i, 1 ), 10) + 1, 1 );
END LOOP;
RETURN MOD(10 - output, 10);
END;
/
然后:
BEGIN
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '1' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '2' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '3' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '4' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '1234' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '000' ) );
END;
/
输出:
1
6
4
2
7
0
db<>fiddle here
我对瑞士工资单的 Luhn 算法有疑问。我在 C、Phyton 或 Java 脚本中找到了一个算法,但我不知道如何在 Oracle 上实现这个算法。
http://dnando.github.io/blog/2014/09/23/check-digit-computation-swiss-pay-slips/
http://www.hosang.ch/modulo10.aspx
此页面展示了算法的样子。
public static int modulo10(string nummer)
{
// 'nummer' darf nur Ziffern zwischen 0 und 9 enthalten!
int[] tabelle = { 0, 9, 4, 6, 8, 2, 7, 1, 3, 5 };
int uebertrag = 0;
foreach (char ziffer in nummer)
uebertrag = tabelle[(uebertrag + ziffer - '0') % 10];
return (10 - uebertrag) % 10;
}
你知道如何在 PLSQL 中实现 table 吗?
在此先感谢您对此算法的帮助。
您可以使用:
CREATE FUNCTION luhn_modulo(
value IN VARCHAR2
) RETURN NUMBER DETERMINISTIC
IS
offsets CONSTANT CHAR(10) := '0946827135';
output PLS_INTEGER := 0;
BEGIN
FOR i IN 1 .. LENGTH( value ) LOOP
output := SUBSTR( offsets, MOD(output + SUBSTR( value, i, 1 ), 10) + 1, 1 );
END LOOP;
RETURN MOD(10 - output, 10);
END;
/
然后:
BEGIN
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '1' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '2' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '3' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '4' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '1234' ) );
DBMS_OUTPUT.PUT_LINE( luhn_modulo( '000' ) );
END;
/
输出:
1 6 4 2 7 0
db<>fiddle here