【问题标题】:Check Digit for Swiss Pay Slips in PLSQL在 PLSQL 中检查瑞士工资单的数字
【发布时间】:2021-03-30 08:24:07
【问题描述】:

我对瑞士工资单的 Luhn 算法有疑问。我在 C、Phyton 或 Java Script 中找到了一个算法,但我不知道如何在 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 中实现表吗?

提前感谢您对此算法的帮助。

【问题讨论】:

    标签: oracle algorithm plsql luhn


    【解决方案1】:

    你可以使用:

    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小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2016-05-02
      • 2014-05-03
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多