挪威出生号

时间:2015-04-26 15:06:23

标签: java string long-integer

我有一个名为Person的类,它看起来像这样:

public abstract class Person {
    private String birthNo;
    ...
}

挪威出生数字长11位,由on this Wikipedia page描述的算法构成。我不能使用int,因为大多数出生数超过Integer.MAX_VALUE

我听说在决定是否应该使用字符串或整数来存储数值时,您应该问自己:我是否需要对此值执行数学运算?

我在birthNo上这样做,但是使用String的charAt(int i),很多操作变得更容易了。如果我将出生数存储为长,我将不得不使用模数和除法来得到所需的数字:

int ninth = Character.getNumericValue(birthNo.charAt(8));

VS。

int ninth = birthNo / 100 % 10

我想要做的数学运算是获得人的性别(女性,如果第9位是偶数),并使用类似于ISBN的算法验证出生数。

使用String的另一个参数是,如果存储为long,则某些出生号将具有前导零,因此不是“11位”。

首选解决方案是什么?长期用于数学运算,还是为了方便而使用String?

3 个答案:

答案 0 :(得分:3)

  

挪威十一位数的出生编号是在出生时分配的   在国家人口登记处登记。寄存器是   由挪威税务局维护。它由日期组成   出生(DDMMYY),一个三位数的个人号码和两个校验位。

我很想创建一个BirthNumber课程,其出生日期为LocalDate,其他两个字段的值为intString,具体取决于你在做什么这样你就可以解析构造函数中的出生号,并使用实例方法获得所需的值。

根据以下评论,这里是我如何包装出生日期:

import java.time.LocalDate;

public class DNumberLocalDate {

    private final LocalDate localDate;
    private final boolean isDNumber;

    public DNumberLocalDate(LocalDate localDate, boolean isDNumber) {
        this.localDate = localDate;
        this.isDNumber = isDNumber;
    }

    public DNumberLocalDate(LocalDate localDate) {
        this(localDate, false);
    }

    public int getDayOfMonth() {
        return isDNumber ? localDate.getDayOfMonth() + 40 : localDate.getDayOfMonth();
    }

}

答案 1 :(得分:2)

出生编号是一个ID但不是数字:您不想在其上使用数学运算。在您的示例中,您希望拆分ID以查找某些信息,但您不想将其划分。因此,您应该使用String。另一个原因是你所说的引导零,一个数字无法处理它。

但是,您可以使用BigDecimalBigInteger作为大号。

答案 2 :(得分:-1)

一个字符串可以代表一个基本整数(领先0和更多) 因此,您应该将其存储为String并将其设置为私有。 你可以为每种类型定义2个geter方法1。 如果您想拥有oop代码,请不要直接访问vars。 格尔茨