Java 挪威出生号码的长或字符串
我有一个叫做Person的类,它看起来像这样:Java 挪威出生号码的长或字符串,java,string,long-integer,Java,String,Long Integer,我有一个叫做Person的类,它看起来像这样: public abstract class Person { private String birthNo; ... } 挪威出生号码有11位数长,由所述算法构造而成。我不能使用int,因为大多数出生数字都超过了Integer.MAX\u值 我听说,在决定使用字符串还是整数来存储数值时,应该问问自己:我需要对这个值执行数学运算吗 我是在birthNo上这样做的,但是使用String的charAt(inti)很多操作变得更容易了。如
public abstract class Person {
private String birthNo;
...
}
挪威出生号码有11位数长,由所述算法构造而成。我不能使用int,因为大多数出生数字都超过了Integer.MAX\u值
我听说,在决定使用字符串还是整数来存储数值时,应该问问自己:我需要对这个值执行数学运算吗
我是在birthNo
上这样做的,但是使用String的charAt(inti)
很多操作变得更容易了。如果我将出生号码存储为长的,我必须使用模和除法来获得所需的数字:
intnixth=Character.getNumericValue(birthNo.charAt(8))代码>
vs
int nixth=birthNo/100%10
我想做的数学运算是获取此人的性别(如果第9位数字是偶数,则为女性),并使用类似于ISBN的算法验证出生号码
使用字符串的另一个参数是,一些出生号码将有前导零,因此如果存储为长字符串,则不是“11位”
首选的解决方案是什么?渴望数学运算,或者为了方便而使用字符串?出生号码是一个ID,但不是一个数字:您不想对其使用数学运算。在您的示例中,您希望拆分ID以查找一些信息,但不希望拆分它。因此,您应该使用String
。另一个原因是前导零正如你所说,数字无法处理它
但是,对于大数字,可以使用BigDecimal
或biginger
挪威11位数的出生号码在出生时或出生时分配
在国家人口登记处登记。登记册是
由挪威税务局维护。它由日期组成
出生(DDMMYY),一个三位数的个人数字和两个校验位数
我很想创建一个BirthNumber
类,其中出生日期为LocalDate
,其他两个字段的值为int
或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();
}
}
字符串可以表示大于基本整数(前导0或更多)
因此,您应该将其存储为字符串并将其设置为私有。
你可以为每种类型定义2个geter方法。
如果你想得到oop代码,就不要直接访问VAR。
Greetz我正在使用数学运算来获取人物的性别(如果第9个数字是偶数,则为女性,否则为男性),并验证出生号码。@MartinMJ您可以通过获取角色并检查其模2值来获取性别。这会忽略对ID的直接数学运算。我明白了。我错误地认为@Happy意味着不做任何数学运算。我同意Happy的观点,这个人的身份证号码实际上是一个标签而不是一个数字,所以String
更合适。如果ID以0
开头怎么办?如果将其存储为long
,则无法捕获它。就像电话号码是真正的标签,而不是真正的数字,不应该以数字类型存储。我可以看到的一个问题是,并非所有的出生号码都可以表示为“日期”。请参阅中列表中的第三项。这听起来像是一个复杂的系统。也许您可以以不同的方式存储D-numbers,或者使用某种标志,或者为LocalDate
创建一个包装类来为您处理这个问题。我想我应该让person类havegetBirthNumberAsLong
,getbirthnumberastring
。或者使用asLong
/asString
方法的birthname
类。你如何存储它并不重要。我将包括一个例子,我可以考虑如何包装出生日期与D数字一起工作。@ RobertBain,我想你是指GETayOfMunth~()的方法,如果它是D数字,则返回40 +<代码> LoalDald.GETEAOFMONTHONE()/<代码>。