首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纸莎草- OCL约束对验证属性的影响

纸莎草- OCL约束对验证属性的影响
EN

Stack Overflow用户
提问于 2021-09-14 15:03:20
回答 1查看 81关注 0票数 1

我的类有两个属性(String),它们是两种类型的人员文档编号。若要验证文档是否有有效编号,则实现计算(验证者数字)。下面的一个例子是如何实现其中之一的一致性:

编号: 973.345.650-02 (必须忽略标点符号)

第一验证器数字计算

代码语言:javascript
复制
9 * 10 = 90
7 * 9 = 63
3 * 8 = 24
3 * 7 = 21
4 * 6 = 24
5 * 5 = 25
6 * 4 = 24
5 * 3 = 15
0 * 2 = 0
----------
Sum = 286

286 % 11 = 0

If rest < 2 then first digit = 0 
Or if rest >= 2 then first digit = 11 - rest

In this case, rest < 2 (0), then first verifier digit = 0

第二验证器数字计算

代码语言:javascript
复制
9 * 11 = 99
7 * 10 = 70
3 * 9 = 27
3 * 8 = 24
4 * 7 = 28
5 * 6 = 30
6 * 5 = 30
5 * 4 = 20
0 * 3 = 0
0 * 2 = 0    ==> FIRST VERIFIER DIGIT
----------
Sum = 328

328 % 11 = 9

Same rule of first verifier digit

If rest < 2 then first digit = 0 
Or if rest >= 2 then first digit = 11 - rest

The rest is greater than 2 (9), then second verifiter digit = 11 - 9 ==> 2

JAVA方法

代码语言:javascript
复制
public static boolean isValidCPF(String cpf) {
    
    cpf = cpf.replaceAll("[./-]", "");      

    if (cpf.length() < 11) {
        return false;
    }
            
    int equalDigits = 0;
    char compareChar = cpf.charAt(0);
    
    for (int i = 1; i <= 9; i++) {
        if (compareChar == cpf.charAt(i)) {
            equalDigits++;
        } else {
            break;
        }
    }
    
    if (equalDigits == 9) {
        return false;
    }
                    
    int[] digit = new int[2];
    int sum = 0, multiply = 2;
    
    for (int k = 8; k <= 9; k++) {
        
        for (int i = k; i >= 0; i--) {
            sum += Character.getNumericValue(cpf.charAt(i)) * multiply++ ;
        }
    
        digit[k-8] = (sum % 11) < 2 ? 0 : 11 - (sum % 11);
        sum = 0;
        multiply = 2;
        
    }
            
    if (cpf.equals(cpf.substring(0 , 9) + digit[0] + digit[1])) {
        return true;
    }
            
    return false;
}

我猜OCL "sequence“在这种情况下必须使用(通过数字循环),将每个序列转换为Integer进行计算,并在约束中使用"body”,但我不知道如何使用。

我想将禁忌应用到Papyrus中的UML模型中(这是我知道如何做的)。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-14 18:28:16

您必须在聚合中声明性地进行思考,这样才能进行仿真。

代码语言:javascript
复制
   for (int i = 1; i <= 9; i++) {
    if (compareChar == cpf.charAt(i)) {
        equalDigits++;
    } else {
        break;
    }
}

你可以尝试这样的方法

代码语言:javascript
复制
Sequence{2..10}->select(i | cpf->at(i) = compareChar)->size()

NB OCL指数从1开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69180214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档