Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 挪威出生号码的长或字符串_Java_String_Long Integer - Fatal编程技术网

Java 挪威出生号码的长或字符串

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)很多操作变得更容易了。如

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

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类have
getBirthNumberAsLong
getbirthnumberastring
。或者使用
asLong
/
asString
方法的
birthname
类。你如何存储它并不重要。我将包括一个例子,我可以考虑如何包装出生日期与D数字一起工作。@ RobertBain,我想你是指GETayOfMunth~()的方法,如果它是D数字,则返回40 +<代码> LoalDald.GETEAOFMONTHONE()/<代码>。