This question already has answers here:
Integer vs String in database

(16个回答)


5年前关闭。




我有一个名为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));

int ninth = birthNo / 100 % 10
我要进行的数学运算是获得该人的性别(如果第9位为偶数,则为女性),并使用类似于ISBN算法的算法来验证出生人数。

使用String的另一个论点是,某些出生数字将以前导零开头,因此如果存储为长整数,则不是“11位数”。

首选的解决方案是什么?渴望进行数学运算,还是渴望使用String?

最佳答案

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

我很想创建一个带有BirthNumber的生日日期以及其他两个字段的LocalDateint值的String类,具体取决于您对它们的处理方式。这样,您可以解析构造函数中的出生编号,并使用实例方法获得所需的值。

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

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();
    }

}

09-27 03:26