2014-02-24 10 views
0

我正在创建一个电话目录,其中包含多个nameEntry对象,每个对象包含姓氏和电话分机号码。存储数字输入 - 为什么Java扫描器nextInt()允许“无效”零填充整数?

public class nameEntry { 

    public String surname; 
    public String number; 

    public nameEntry(String surname, int number) { 
     this.surname = surname.toUpperCase(); 
     this.number = String.format("%04d", number); 
     // converts int literal to 0 filled string of numbers 
    } 

    public String toString() { 
     return surname + "\t" + number; //eg HOOD 
    } 
} 

已经读到好的java实践有关存储字母数字我已经设定了nameEntry对象采取int作为参数,然后将其转换为填充零String,因为存储为int对象会给出他们的性质是不恰当的。但是,这种方法意味着我无法通过此方法创建具有零填充数的新nameEntry对象,因为它告诉我整数无效;

nameEntry e = new nameEntry(surname, 0123); //this would be flagged as wrong 

但是,如果我用一个Scanner nextInt(System.in)方法,它是完全符合我进入填零位,然后使用该对象创建一个新的nameEntry对象高兴。

为什么此场景有效?

无论如何,这一切似乎只是为了得到一个零填充的输入字符串 - 允许用户输入单个数字最多4个字符的更好的方法是填零或将进入后自动填零?

+0

'0123'不是一个整数,在Java中 – Brian

+1

@GIJoe从什么时候开始呢? –

+0

它只是@ @ peter.petrov指出的,它是一个八进制。因此,08不存在并且不是有效的整数。 0123仍然存在。 –

回答

1

存储[电话号码]作为整数是不适合的,因为它们的性质。

那么,你为什么要阅读它们的整数?为什么不使用Scanner.next()Scanner.nextLine(),因为您知道电话号码不是(概念上)数字?

您应该期望您的用户准确传递他们期望的电话号码。试图改变它(例如,让他们离开领先0并填充自己)是混淆和错误的秘诀。而不是转换用户的输入,添加健全性检查,如正则表达式,以确认用户提供了有效的输入。

public class nameEntry { 
    private static final Pattern VALID_NUMBER = Pattern.compile("\\d{4}"); 
    private String surname; 
    private String number; 

    public nameEntry(String surname, String number) { 
    this.surname = surname; 
    if(!VALID_NUMBER.matcher(number).matches()) { 
     throw new IllegalArgumentException(number+ 
       " does not appear to be a valid phone number."); 
    } 
    this.number = number; 
    } 

    @Override 
    public String toString() { 
    return surname + "\t" + number; //eg HOOD 
    } 
} 
+0

抱歉,我忘记提及我使用int的方式,因此,在读取它们来创建对象时,如果您尝试输入非数字字符,则会引发错误,而如果它是字符串,我不知道如何实现等效效果 - 但你已经回答了,所以谢谢! – davidhood2

1

当解析从String的整数值(包括当使用Scanner及其nextInt()方法),爪哇简单地忽略所述前导零时的基数为10(十进制,这是默认值)。

String bar = "0123"; 
int foo = Integer.valueOf(bar); 
System.out.println(foo); 

输出:

如果您需要明确排除输入已经领先0那么你就需要读取输入为String,并检查自己是否或者没有一个前导零。

+0

@ davidhood2在所有的'扫描仪'正在做的就是我发布的内容。你只需检查前导零*先*然后将'String'解析为一个'int',如上所示,如果这是你想要的。 –