Long 或 String 挪威出生号码

Long or String for Norwegian birth number

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

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

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

我听说在决定使用字符串还是整数来存储数值时,您应该问问自己:我需要对这个值进行数学运算吗?

我在 birthNo 上执行此操作,但使用 String 的 charAt(int i) 时,许多操作变得更容易一些。如果我要将出生数字存储为 long,我将不得不使用模和除法来获得所需的数字:

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

对比

int ninth = birthNo / 100 % 10

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

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

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

出生号是一个 ID 但不是数字:您不想对其进行数学运算。在你的例子中你想拆分 ID 来查找一些信息,你不想拆分它。因此,您应该使用 String。另一个原因是如您所说的前导零,数字无法处理它。

但是,对于大数字,您可以使用 BigDecimalBigInteger

The Norwegian eleven digit Birth Number is assigned at birth or registration with the National Population Register. The register is maintained by the Norwegian Tax Office. It is composed of the date of birth (DDMMYY), a three digit individual number, and two check digits.

我很想创建一个 BirthNumber class,其中 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();
    }

}

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