0

我正在创建一个电话目录,其中包含多个nameEntry对象,每个对象都包含一个姓氏和一个电话分机。

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     0123
    }
} 

在阅读了关于存储字母数字的良好 Java 实践后,我已经对nameEntry对象进行了编程,以将 anint作为参数,然后将其转换为填零String,因为考虑到它们的性质,将其存储为intObjects 是不合适的。但是,这种方法意味着我无法nameEntry通过这种方法创建填充数字为零的新对象,因为它告诉我整数无效;

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

但是,如果我使用一种Scanner nextInt(System.in)方法,是否对我输入一个零填充数字然后使用该对象创建一个新nameEntry对象感到非常满意。

为什么这种情况有效?

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

4

2 回答 2

1

考虑到它们的性质,将 [电话号码] 存储为整数是不合适的。

那么你为什么把它们读成整数呢?为什么不使用Scanner.next()or 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     0123
  }
}
于 2014-02-24T20:16:37.197 回答
1

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

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

输出:

123

如果您需要专门排除具有前导的输入,0那么您需要将输入读取为 aString并自行检查是否有前导零。

于 2014-02-24T20:21:17.397 回答